图的割边--仅仅与割点有一个等号的差别
#include<iostream> #include<cstdio> using namespace std; int u[1024],v[1024]; int first[1024],Next[1024]; int root,index=1,num[1024],low[1024]; bool book[1024]; int n,m; void dfs(int cur,int father) { low[cur]=num[cur]=index++; int k=first[cur]; while(k!=-1){ if(num[v[k]]==0){ dfs(v[k],cur); low[cur]=min(low[v[k]],low[cur]); if(low[v[k]]>num[cur]){ book[k]=1; cout<<u[k]<<" "<<v[k]<<endl; } } else if(v[k]!=father){ low[cur]=min(low[cur],num[v[k]]); } k=Next[k]; } } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ scanf("%d%d",&u[i],&v[i]); } fill(first,first+n+1,-1); for(int i=1;i<=m;i++){ u[i+m]=v[i]; v[i+m]=u[i]; } for(int i=1;i<=2*m;i++){ Next[i]=first[u[i]]; first[u[i]]=i; } root = 1; dfs(1,root); }
代码参考于《啊哈,算法》
如需转载,请注明出处
如有侵权,联系删除
2290713181@qq.com
如有侵权,联系删除
2290713181@qq.com