最基本的找桥,要注意0的情况,不用输出空行,zoj现在真慢
/*
author:jxy
lang:C/C++
university:China,Xidian University
**If you need to reprint,please indicate the source**
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
#define Maxm 200005
#define Maxn 10005
int first[Maxm];
int U[Maxm];
int num[Maxm];
int next[Maxm];
int vis[Maxn],low[Maxn],dph[Maxn];
vector<int> ans;
int cnt;
void add(int v,int u)
{
cnt++;
for(int i=first[v];~i;i=next[i])
if(U[i]==u)//重边处理
{
num[i]++;
return;
}
next[cnt]=first[v];
first[v]=cnt;
U[cnt]=u;
num[cnt]=1;
}
int dfs(int v,int f,int d)
{
vis[v]=1;
low[v]=dph[v]=d;
for(int i=first[v];~i;i=next[i])
{
int &u=U[i];
if(vis[u])
{
if(u!=f)low[v]=min(low[v],dph[u]);
}
else
{
dfs(u,v,d+1);
if(low[u]>dph[v]&&num[i]==1)//num[i]>1为有重边
ans.push_back(i|1);
low[v]=min(low[u],low[v]);
}
}
}
int main()
{
int T;
int n,m;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
int i;
int a,b;
memset(vis,0,sizeof(vis));
memset(first,-1,sizeof(first));
cnt=-1;
for(i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
add(a,b);add(b,a);
}
ans.clear();
dfs(1,-1,0);
sort(ans.begin(),ans.end());
printf("%d\n",ans.size());
if(ans.size())printf("%d",(ans[0]+1)/2);
for(i=1;i<ans.size();i++)
printf(" %d",(ans[i]+1)/2);
if(ans.size())puts("");
if(T)puts("");
}
}