【POJ3177】Redundant Paths

来源:互联网 发布:潭州seo视频教程92期 编辑:程序博客网 时间:2024/06/08 11:06
#include<iostream>#include<cstdio>#include<cstring>#define N 10005using namespace std;int head[N],low[N],dfn[N],block[N],st[N],inst[N];int ne=1,index,top,scc,d[N];struct data{int to,ne;}e[N*2];void charu(int u,int v){e[++ne].to=v;e[ne].ne=head[u];head[u]=ne;}void tarjan(int x,int fa){low[x]=dfn[x]=++index;st[++top]=x;inst[x]=1;for(int i=head[x];i;i=e[i].ne){if(i==(fa^1))continue;else if(!dfn[e[i].to]){tarjan(e[i].to,i);low[x]=min(low[x],low[e[i].to]);}else if(inst[e[i].to]) low[x]=min(dfn[e[i].to],low[x]);}if(low[x]==dfn[x]){scc++;int t;while(1){t=st[top--];inst[t]=0;block[t]=scc;if(t==x)break;}}}int main(){int n,m,u,v;scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){scanf("%d%d",&u,&v);{charu(u,v);charu(v,u);}}for(int i=1;i<=n;i++)  if(!dfn[i])tarjan(1,-1);int sum=0;for(int i=1;i<=n;i++) for(int j=head[i];j;j=e[j].ne)  {   if(block[i]!=block[e[j].to])   d[block[i]]++;   }for(int i=1;i<=n;i++) if(d[i]==1)sum++;printf("%d\n",(sum+1)/2);return 0;}

0 0
原创粉丝点击