时间复杂度O(N+M)
#include <bits/stdc++.h>//最下面有数据验证
using namespace std;
int first[15];
int then[15];
int root;
int idx;
int num[15];
int low[15];
int u[20],v[20];
int n,m;
void dfs(int cur,int father){
idx++;
num[cur]=idx;
low[cur]=idx;
int k;
k=first[cur];
while(k!=-1){
if(num[v[k]]==0){
dfs(v[k],cur);
low[cur]=min(low[cur],low[v[k]]);
if(low[v[k]]>num[cur]){ //与求割点>=不同,如果回不到祖宗节点,也不能通过儿子节点回到父亲,则u--v(cur--v[k])这条边是割边
printf("%d-%d\n",cur,v[k]);
}
}else if(v[k]!=father){
low[cur]=min(low[cur],num[v[k]]);
}
k=then[k];
}
return ;
}
int main(){
scanf("%d%d",&n,&m);
int i;
for(i=1;i<=m;i++){
cin>>u[i]>>v[i];
}
for(i=m+1;i<=2*m;i++){
u[i]=v[i-m];
v[i]=u[i-m];
}
for(i=1;i<=2*m;i++){
first[i]=-1;
}
for(i=1;i<=2*m;i++){
then[i]=first[u[i]];
first[u[i]]=i;
}
root=1;
dfs(1,root);
return 0;
}
/*输入
6 6
1 4
1 3
4 2
3 2
2 5
5 6
*/
/*输出
5-6
2-5
*/