Cod sursa(job #1156146)

Utilizator myshuSpatariu Mihai-Constantin myshu Data 27 martie 2014 14:27:57
Problema Componente biconexe Scor 12
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include<fstream>
using namespace std;
struct nod{int info ;
			nod * urm;}v[100001],*p,*w[100001];
int poz[100001],viz[100001],viz2[100001],nivel[100001],k;
void ciclu(int x, int t)
{
	if(nivel[t]>nivel[x])
	{
		if(viz[t]==0)
		{
			viz[t]=++k;
		}
		viz[x]=viz[t];
		while(x!=t)
			{
				viz[t]=viz[x];
				t=poz[t];
			}
	}
}
void df(int x,int y)
{
	nod *q;
	q=&v[x];
		while(q->urm!=NULL)
		{
			if(poz[q->urm->info]!=0)
				{
					if(q->urm->info!=y)
						ciclu(x,q->urm->info);
				}
			else 
			{
				poz[q->urm->info]=x;
				nivel[q->urm->info]=nivel[x]+1;
				df(q->urm->info,x);
			}
			if(q!=NULL)q=q->urm;
			if(q==NULL)break;
		}
}
int main()
{
	int n,m,i,x,y,u=0,nr=0;
	ifstream fcin("biconex.in");
	ofstream fcout("biconex.out");
	fcin>>n>>m;
	for(i=1;i<=n;i++) 
		{v[i].info=0;v[i].urm=NULL;w[i]=&v[i];}
	for(i=1;i<=m;i++)
	{	fcin>>x>>y;
		v[x].info++;
		p=new nod;
		p->info=y;
		p->urm=NULL;
		w[x]->urm=p;
		w[x]=p;
		v[y].info++;
		p=new nod;
		p->info=x;
		p->urm=NULL;
		w[y]->urm=p;
		w[y]=p;
	}	
	poz[1]=-1;
	nivel[1]=1;
	df(1,-1);
	u=k;
	for(i=n;i>=2;i--)
	{
		if(viz[i]!=viz[poz[i]]||viz[i]==0)
		{
			v[++u].info=-1;
			p=new nod;
			p->info=poz[i];
			p->urm=NULL;
			v[u].urm=p;
			p=new nod;
			p->info=i;
			p->urm=NULL;
			v[u].urm->urm=p;
		}
		else 
		{
			if(viz2[viz[i]]==0)
				{
					nr++;
					viz2[viz[i]]=1;
				}
			p=new nod;
			p->info=i;
			p->urm=NULL;
			w[viz[i]]->urm=p;
			w[viz[i]]=p;
		}
	}
	fcout<<u-k+nr<<'\n';
	fcout<<nr<<' '<<k<<' ';
	return 0;
}