zoj 2588 Burning Bridges 桥

 

#include <stdio.h>
#include <string.h>
#define clr(a) memset(a,0,sizeof(a))
#define N 10005
#define M 100005
int MIN(int a,int b)
{
	if(a<b) return a;
	else return b;
}
struct Node
{
	int j,tag,id;
	Node *next;
};
int n,m,nid,memp;
Node mem[M*2],*e[N];
int bridge[M],nbridge,low[N],dfn[N],vis[N];

int addedge(Node *e[],int i,int j)
{
	Node* p;
	for(p=e[i];p!=NULL;p=p->next)
		if(p->j==j) break;
	if(p!=NULL)
	{
		p->tag++;
		return 0;
	}
	p=&mem[memp++];
	p->j=j;p->next=e[i];e[i]=p;p->id=nid;p->tag=0;
	return 1;
}

void dfs(int i,int father,int dth)
{
	int j;
	vis[i]=1;dfn[i]=low[i]=dth;
	Node *p;
	for(p=e[i];p!=NULL;p=p->next)
	{
		j=p->j;
		if(j!=father&&vis[j]==1)
			low[i]=MIN(low[i],dfn[j]);
		if(vis[j]==0)
		{
			dfs(j,i,dth+1);
			low[i]=MIN(low[i],low[j]);
			if(low[j]>dfn[i]&&!p->tag)
				bridge[p->id]=++nbridge;
		}
	}
}

int main()
{
	int i,j,k,t;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d",&n,&m);
		memp=0;nid=0;clr(e);
		for(k=0;k<m;k++,nid++)
		{
			scanf("%d%d",&i,&j);
			addedge(e,i-1,j-1);
			addedge(e,j-1,i-1);
			bridge[nid]=0;
		}
		nbridge=0;clr(vis);
		dfs(0,-1,1);
		printf("%d\n",nbridge);
		for(i=0,k=nbridge;i<m;i++)
		{
			if(bridge[i])
			{
				printf("%d",i+1);
				if(--k) printf(" ");
			}
		}
		if(nbridge) puts("");
		if(t) puts("");
	}
	return 0;
}


 

 

posted @ 2014-01-11 10:38  贝尔摩德  阅读(121)  评论(0编辑  收藏  举报