Cod sursa(job #466021)

Utilizator mihai995mihai995 mihai995 Data 25 iunie 2010 18:56:26
Problema Mesaj4 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <fstream>
using namespace std;

struct relatie{int x,y;};
bool use[100001];
int coada[100001],pr[100001],n,m,p=0,u=1;
relatie v[200001];

ifstream in("mesaj4.in");
ofstream out("mesaj4.out");

int bsearch(int x)
{
	int i,step=1<<17;
	for (i=0;step;step>>=1)
		if (i+step<=m && v[i+step].x<x)
			i+=step;
	return i+1;
}

void dfs()
{
	int x,i;
	coada[1]=1;
	use[1]=true;
	while (p<u)
		for (x=coada[++p],i=bsearch(x);v[i].x==x;i++)
			if (!use[v[i].y])
			{
				use[v[i].y]=true;
				pr[++u]=x;
				coada[u]=v[i].y;
			}
}

void scr(int x)
{
	if (x==1)
		return;
	out<<coada[x]<<" "<<pr[x]<<"\n";
	scr(x-1);
	out<<pr[x]<<" "<<coada[x]<<"\n";
}

bool cmp(relatie a,relatie b)
{
	return a.x<b.x || a.x==b.x && a.y<b.y;
}	

int main()
{
	int i,x,y;
	in>>n>>m;
	for (i=1;i<=m;i++)
	{
		in>>x>>y;
		v[i].x=x;v[i].y=y;
		v[i+m].x=y;v[i+m].y=x;
	}
	m<<=1;
	sort(v+1,v+m+1,cmp);
	dfs();
	if (u!=n)
	{
		out<<"-1\n";
		return 0;
	}
	out<<2*(n-1)<<"\n";
	scr(n);
	return 0;
}