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
原文地址:https://www.cnblogs.com/fanminghui/p/3553720.html