Cod sursa(job #613584)

Utilizator DeadEyeNaiba Mihai Lucian DeadEye Data 1 octombrie 2011 02:59:17
Problema Componente biconexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include<cstdio>
#include<algorithm>
#include<vector>

using namespace std;

const int maxN=100005;
const int maxM=200005;

vector<int> G[maxN],S[maxN];
int n,m,nr,ns,l[maxN],par[maxN],viz[maxN],lv[maxN],s1[maxM],s2[maxM];

void citire()
{
	freopen("biconex.in","r",stdin);
	freopen("biconex.out","w",stdout);
	scanf("%d%d",&n,&m);
	int x,y;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		G[x].push_back(y);
		G[y].push_back(x);
	}
}

void dfs(int x)
{
	viz[x]=1;
	l[x]=lv[x];
	for(int i=0;i<G[x].size();++i)
	{
		int ff=G[x][i];
		if(!viz[ff])
		{
			lv[ff]=lv[x]+1;
			par[ff]=x;
			ns++; s1[ns]=x; s2[ns]=ff;
			dfs(ff);
			if(l[x]>l[ff])
				l[x]=l[ff];
			if(l[ff]>=lv[x])
			{
				nr++;
				while(!(s1[ns]==x && s2[ns]==ff))
				{
					S[nr].push_back(s1[ns]);
					S[nr].push_back(s2[ns]);
					--ns;
				}
				S[nr].push_back(s1[ns]);
				S[nr].push_back(s2[ns]);
				--ns;
			}
		}
		else
		{
			if(par[x]!=ff && lv[ff]<lv[x])
			{
				if(l[x]>lv[ff])
					l[x]=lv[ff];
				ns++;
				s1[ns]=x;
				s2[ns]=ff;
			}
		}
	}
}

void afis()
{
	printf("%d\n",nr);
	int i,j;
	for(i=1;i<=nr;i++)
	{
		sort(S[i].begin(),S[i].end());
		for(j=0;j<S[i].size();++j)
			if((j>0 && S[i][j-1]!=S[i][j])||(j==0))
				printf("%d ",S[i][j]);
		printf("\n");
	}
}
int main()
{
	citire();
	int i,j;
	/*for(i=1;i<=n;++i)
	{
		for(j=0;j<G[i].size();++j)
			printf("%d ",G[i][j]);
		printf("\n");
	}*/
	nr=0; i=1;
	dfs(1);
	/*for(i=1;i<=n;i++)
		if(!viz[i])
		{
			nr++;
			dfs(i);
		}
	for(i=1;i<=n;i++)
		printf("%d ",lv[i]);
	printf("\n");*/
	afis();
	return 0;
}