http://icpc.upc.edu.cn/problem.php?cid=1460&pid=39
一道无向图求割边的裸题……
Tarjan后if(low[v]>dfn[u]),连接u和v的点即为割边。
注意判断if(father!=x),判断无向图中的重边。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct str{
int n,t;
}e[2000000];
int n,m,tt,x,y,ans,t,h[200006],dfn[100006],low[100006];
void add(int x,int y){
tt++;
e[tt].t=y;
e[tt].n=h[x];
h[x]=tt;
}
void Tarjan(int x,int f){
dfn[x]=low[x]=++t;
for(int i=h[x];i;i=e[i].n){
int v=e[i].t;
if(!dfn[v]){
Tarjan(v,x);
low[x]=min(low[x],low[v]);
if(low[v]>dfn[x]) ans++;
}
else if(v!=f) low[x]=min(low[x],dfn[v]);
}
}
int main(){
while (~scanf("%d%d",&n,&m)){
if(n==0&&m==0) break;
tt=t=ans=0;
memset(h,0,sizeof(h));
memset(dfn,0,sizeof(dfn));
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
add(x,y),add(y,x);
}
Tarjan(1,1);
printf("%d\n",ans);
}
}