首页 > 代码库 > POJ——T3352 Road Construction

POJ——T3352 Road Construction

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 Edge11 {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