Cod sursa(job #466052)

Utilizator bora_marianBora marian bora_marian Data 25 iunie 2010 21:52:00
Problema Mesaj4 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include<fstream>
using namespace std;
struct nod{
	int info;
	nod *next;
};
int n,m,vizitat[100003],grad[100004],sol,gasit,first;
nod *g[100004];
void dfs1(int k);
void adauga(int a,int b);
ofstream fout("mesaj4.out");
void dfs2(int k);
int main()
{
	ifstream fin("mesaj4.in");
	fin>>n>>m;
	int i;
	for(i=1;i<=m;i++)
	{
		int x,y;
		fin>>x>>y;
		grad[x]++;
		grad[y]++;
		adauga(x,y);
		adauga(y,x);
	}
	int cont=0;
	for(i=1;i<=n;i++)
		if(grad[i]==1)
			first=i,cont++;
	if(first!=0)
	{	
		sol+=1+2*(cont-1)+(n-cont-1);
		sol+=n-1;
		fout<<sol<<endl;
		dfs1(first);
	}
	else
	{	
		fout<<2*(n-1)<<endl;
		dfs1(1);
	}
	dfs2(gasit);
	return 0;
}
void dfs1(int k)
{
	vizitat[k]=1;	
	for(nod *p=g[k];p;p=p->next)
		if(vizitat[p->info]==0)
		{
			gasit=p->info;
			fout<<k<<" "<<p->info<<endl;
			if(grad[p->info]==1 && p->info!=first)
				fout<<p->info<<" "<<k<<endl;
			dfs1(p->info);
		}
}
void adauga(int a,int b)
{
	nod *p=new nod;
	p->info=b;
	p->next=g[a];
	g[a]=p;
}
void dfs2(int k)
{
	vizitat[k]=0;
	for(nod *p=g[k];p;p=p->next)
		if(vizitat[p->info]==1)
		{
			fout<<k<<" "<<p->info<<endl;
			dfs2(p->info);
		}
}