• poj 3352 Road Construction


    http://poj.org/problem?id=3352

      1 #include <cstdio>
      2 #include <iostream>
      3 #include <cstring>
      4 #include <queue>
      5 #include <algorithm>
      6 #define maxn 300000
      7 using namespace std;
      8 
      9 const int inf=1<<30;
     10 int head[maxn],dfn[maxn],low[maxn],belong[maxn],stack1[maxn],du[maxn];
     11 int e,bcc_clock,bcnt,top,N,E;
     12 bool vis[maxn],visi[maxn];
     13 
     14 struct node
     15 {
     16     int u,v,next;
     17 } p[maxn];
     18 
     19 void add(int u,int v)
     20 {
     21     p[e].u=u;
     22     p[e].v=v;
     23     p[e].next=head[u];
     24     head[u]=e++;
     25     p[e].u=v;
     26     p[e].v=u;
     27     p[e].next=head[v];
     28     head[v]=e++;
     29 }
     30 
     31 void tarjan(int u,int fa)
     32 {
     33     vis[u]=true;
     34     dfn[u]=low[u]=++bcc_clock;
     35     stack1[++top]=u;
     36     for(int i=head[u]; i!=-1; i=p[i].next)
     37     {
     38         int v=p[i].v;
     39         if(v==fa) continue;
     40         if(!dfn[v])
     41         {
     42             tarjan(v,u);
     43             low[u]=min(low[u],low[v]);
     44         }
     45         else if(vis[v])
     46         {
     47             low[u]=min(low[u],dfn[v]);
     48         }
     49     }
     50     if(dfn[u]==low[u])
     51     {
     52         bcnt++;
     53         int j;
     54         do
     55         {
     56             j=stack1[top--];
     57             vis[j]=false;
     58             belong[j]=bcnt;
     59         }
     60         while(j!=u);
     61     }
     62 }
     63 
     64 void deal()
     65 {
     66     bcc_clock=0,bcnt=0,top=0;
     67     memset(vis,false,sizeof(vis));
     68     memset(belong,0,sizeof(belong));
     69     memset(dfn,0,sizeof(dfn));
     70     tarjan(1,1);
     71 }
     72 
     73 void dfs(int u)
     74 {
     75     visi[u]=true;
     76     for(int i=head[u]; i!=-1; i=p[i].next)
     77     {
     78         int v=p[i].v;
     79         if(!visi[v])
     80         {
     81             if(belong[v]!=belong[u])
     82             {
     83                 ++du[belong[u]];
     84                 ++du[belong[v]];
     85             }
     86             dfs(v);
     87         }
     88     }
     89 }
     90 void inti()
     91 {
     92     memset(head,-1,sizeof(head));
     93     e=0;
     94 }
     95 
     96 int main()
     97 {
     98     while(cin>>N>>E)
     99     {
    100         inti();
    101         int x,y;
    102         for(int i=0; i<E; i++)
    103         {
    104             scanf("%d%d",&x,&y);
    105             add(x,y);
    106         }
    107         deal();
    108         if(bcnt==1)
    109         {
    110             printf("0
    ");
    111             continue;
    112         }
    113         memset(du,0,sizeof(du));
    114         int leaf=0;
    115         memset(visi,false,sizeof(visi));
    116         dfs(1);
    117         for(int i=1; i<=bcnt; i++)
    118         {
    119             if(du[i]==1) leaf++;
    120         }
    121         printf("%d
    ",(leaf+1)/2);
    122     }
    123     return 0;
    124 }
    View Code
  • 相关阅读:
    从源码剖析Lua数据类型
    【Mysql】主从同步配置
    【Logstash】Logstash收集Nginx访问日志(二十六)
    【Logstash】Logstash快速入门(二十五)
    【Kibana】集群监控(二十四)
    【Beats】Metricbeat 收集Nginx指标数据(二十三)
    【Beats】Metricbeat快速入门(二十二)
    【Beats】Filebeat 与 Kibana仪表板(二十一)
    【Kibana】坐标地图(二十)
    【Beats】Filebeat收集Nginx日志(十九)
  • 原文地址:https://www.cnblogs.com/fanminghui/p/3553720.html
Copyright © 2020-2023  润新知