POJ——T3352 Road Construction

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

vis表示访问的次序 low的值相同的点在同一连通分量

 1 #include <algorithm>
 2 #include <cstring>
 3 #include <cstdio>
 4 
 5 using namespace std;
 6 
 7 const int N(2017);
 8 int n,m,u,v,ans;
 9 int head[N],sumedge;
10 struct Edge
11 {
12     int to,next;
13     Edge(int to=0,int next=0) :
14         to(to),next(next) {}
15 }edge[N<<1];
16 
17 void ins(int from,int to)
18 {
19     edge[++sumedge]=Edge(to,head[from]);
20     head[from]=sumedge;
21 }
22 
23 int tim,dfn[N],low[N],vis[N],du[N];
24 int sumcol,col[N],colvis[N];
25 
26 void DFS(int now,int pre)
27 {
28     low[now]=dfn[now]=++tim;
29     vis[now]=1;
30     for(int i=head[now];i;i=edge[i].next)
31     {
32         int go=edge[i].to;
33         if(go==pre) continue;
34         if(!vis[go])
35         {
36             DFS(go,now);
37             low[now]=min(low[now],low[go]);
38         } else if(vis[go]==1)
39             low[now]=min(low[now],dfn[go]);
40     }
41     vis[now]=2;
42 }
43 
44 int main()
45 {
46     scanf("%d%d",&n,&m);
47     for(;m;m--)
48     {
49         scanf("%d%d",&u,&v);
50         ins(u,v); ins(v,u);
51     }
52     for(int i=1;i<=n;i++)
53         if(!vis[i]) DFS(i,i);
54     for(u=1;u<=n;u++)
55         for(int j=head[u];j;j=edge[j].next)
56         {
57             v=edge[j].to;
58             if(low[u]!=low[v])
59                 du[low[u]]++;
60         }
61     for(int i=1;i<=n;i++)
62         if(du[i]==1) ans++;  
63     printf("%d\n",(ans+1)>>1);
64     return 0;
65 }

 

posted @ 2017-05-20 22:32  Aptal丶  阅读(157)  评论(0编辑  收藏  举报