题目意思:
给你n,m表示一个图的n个点,m条边。 下面m行为 x ,y即x和y之间有条边,求割边,2个坑点:若图不连通输出0;若有多条割边按输入先后顺序输出,而且x,y顺序也和输入时一致
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
using namespace std;
#define N 10005
struct node{
int x, y, id, id1, id2;
}ans[N];
struct mem{
int y, id, id1, id2;
};
vector<mem>ve[N];
map<string,int>ma;
map<int,string>mb;
int low[N], dfn[N];
int visited[N];
int n, m, dfn_clock;
int nu;
void init(){
for(int i=0;i<=n;i++) ve[i].clear();
ma.clear();mb.clear();
memset(dfn,-1,sizeof(dfn));
memset(visited,0,sizeof(visited));
}
void dfs(int u,int fa){
int i, j, k, v;
node p;
mem q;
//printf("1111111111\n");
low[u]=dfn[u]=dfn_clock++;
visited[u]=1;
for(i=0;i<ve[u].size();i++){
q=ve[u][i];
if(q.y==fa) continue;
// printf("%d\n",v);
if(!visited[q.y]){
dfs(q.y,u);
low[u]=min(low[u],low[q.y]);
if(low[q.y]>dfn[u]) {
p.x=u;p.y=q.y;p.id=q.id;p.id1=q.id1;p.id2=q.id2;
ans[nu++]=p;
}
}
else low[u]=min(low[u],dfn[q.y]);
}
}
bool cmp(node a,node b){
return a.id<b.id;
}
main()
{
int t, i, j, k, id;
char s1[200], s2[200];
mem p;
cin>>t;
while(t--){
scanf("%d %d",&n,&m);
init();k=1;id=1;
while(m--){
scanf("%s%s",s1,s2);
if(ma[s1]==0) ma[s1]=k,mb[k]=s1,++k;
if(ma[s2]==0) ma[s2]=k,mb[k]=s2,++k;
int x=ma[s1], y=ma[s2];
p.y=ma[s2];p.id=id++;p.id1=1;p.id2=2;
ve[x].push_back(p);
p.y=ma[s1];p.id=id++;p.id1=2;p.id2=1;
ve[y].push_back(p);
}
dfn_clock=nu=0;
dfs(1,-1);
int f=1;
for(i=1;i<=n;i++) {
if(dfn[i]==-1){
break;
}
}
if(i<=n){
printf("0\n");continue;
}
sort(ans,ans+nu,cmp);
printf("%d\n",nu);
for(i=0;i<nu;i++){
if(ans[i].id1<ans[i].id2)
cout<<mb[ans[i].x]<<" "<<mb[ans[i].y]<<endl;
else cout<<mb[ans[i].y]<<" "<<mb[ans[i].x]<<endl;
}
}
}