1. 程式人生 > >POJ——T3352 Road Construction

POJ——T3352 Road Construction

cst scan sca problem can style clu urn images

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

技術分享

技術分享

技術分享

vis[0]表示樹邊, 1 表示後向邊,2 表示

 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 }

POJ——T3352 Road Construction