Cod sursa(job #701017)

Utilizator gabriel93Robu Gabriel gabriel93 Data 1 martie 2012 13:10:34
Problema Componente biconexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.28 kb
#include<stdio.h>
#include<cstring>
using namespace std;
int n,m,viz[100002],r,vmin[100002],h[100002],f[100002],nrc,crt[100002];

struct nod
{
	int v;
	nod *adresa;
};
nod *a[100002];

void adaug(int x,int y)
{
	nod *p;
	p=new nod;
	p->v=y;
	p->adresa=a[x];
	a[x]=p;
}

void citire()
{
	int i,x,y;
	scanf("%d %d",&n,&m);
	memset(a,0,sizeof(a));
	for(i=1;i<=m;i++)
	{
		scanf("%d %d",&x,&y);
		adaug(x,y);
		adaug(y,x);
	}
	fclose(stdin);
}

int dfs(int t,int k)
{
	nod *p;
	int c,vvmin;
	r++;
	c=0;
	h[k]=r;
	viz[k]=1; vvmin=k;
	vmin[k]=k;
	for(p=a[k];p;p=p->adresa)
		if(viz[p->v]==0 && p->v!=t)
		{
			c++;
			vmin[k]=dfs(k,p->v);
			if(vmin[k]<=r)
			{
				c--;
				if(h[vmin[k]] < h[vvmin])
					vvmin=vmin[k];
			}
		}
		else
		{
			if(viz[p->v] && p->v!=t && h[p->v] < h[vmin[k]])
			{
				vmin[k]=p->v;
				if(vmin[k]<vvmin)
					vvmin=vmin[k];
			}
		}
	if(c>0)
	{
		nrc++;
		crt[nrc]=k;
		f[k]=1;
	}
	r--;
	vmin[k]=vvmin;
	return vvmin;
}

int main()
{
	nod *p,*q;
	int i,j,ok,st[100002],poz,vmin[100002],nrm;
	freopen("biconex.in","r",stdin);
	freopen("biconex.out","w",stdout);
	citire();
	i=dfs(0,1);
	
	nrm=0;
	for(i=1;i<=nrc;i++)
		for(p=a[crt[i]];p;p=p->adresa)
				if(f[p->v] == 1 && crt[i] < p->v)
				{
					nrm++;
					
					q=new nod;
					q->v=p->v;
					q->adresa=a[0];
					a[0]=q;
					
					q=new nod;
					q->v=crt[i];
					q->adresa=a[0];
					a[0]=q;
				}

	printf("%d\n",2*nrm+1);
	for(p=a[0];p;p=p->adresa)
	{
		printf("%d ",p->v);
		p=p->adresa;
		printf("%d\n",p->v);
	}
	
	ok=1;
	memset(viz,0,sizeof(viz));
	while(ok)
	{
		ok=0;
		for(i=1;i<=n;i++)
			if(viz[i]==0)
			{
				j=i;
				ok=1;
			}
		for(i=1;i<=n;i++)
			if(f[i])
				viz[f[i]]=0;
		viz[j]=1;
		poz=ok;
		st[1]=j;
		if(ok)
			printf("%d ",st[1]);
		while(poz)
		{
			for(p=a[st[poz]];p;p=p->adresa)
				if(viz[p->v]==0 && (f[st[poz]]==0 || f[p->v]==0) )
				{
					printf("%d ",p->v);
					poz++;
					viz[p->v]=1;
					st[poz]=p->v;
					break;
				}
			if(p==0)
				poz--;
		}
		printf("\n");
	}
	
	
	/*for(i=1;i<=n;i++)
	{
		printf("%d - ",i);
		for(p=a[i];p;p=p->adresa)
			printf("%d ",p->v);
		printf("\n");
	}
	
	for(i=1;i<=n;i++)
		printf("%d ",f[i]);*/
	
	return 0;
}