Pagini recente » Cod sursa (job #2718999) | Cod sursa (job #1877581) | Cod sursa (job #2619023) | Cod sursa (job #3275211) | Cod sursa (job #2643311)
#include <stdio.h>
#include <vector>
#include <stack>
#define NMAX 50005
using namespace std;
FILE *fin = fopen("domino.in", "r");
FILE *fout = fopen("domino.out", "w");
int n,i,x,y,incep,nr,nod,lat,ultimalat,sfarsit,nrc;
bool viz[NMAX],rotult,vizitat[10];
struct muchie {int inc; int sf;} arc[NMAX];
vector <int> g[10];
stack <int> stiva,ans;
stack <bool> rotire;
void DF(int i)
{
vizitat[i]=1;
for(int j=0;j<g[i].size();j++){
int m;
m=g[i][j];
int nod;
nod=arc[m].inc+arc[m].sf-i;
if(vizitat[nod]==0) DF(nod);
}
}
int main()
{
fscanf(fin, "%d", &n);
for(i=1; i<=n; ++i)
{
fscanf(fin, "%d%d", &x,&y);
arc[i].inc = x;
arc[i].sf = y;
g[x].push_back(i);
// if(x!=y)
g[y].push_back(i);
}
for(i=0; i<=9; ++i)
if(g[i].size() and g[i].size()%2)
nr++;
for(int i=0;i<=9;i++)
if(vizitat[i]==0 and g[i].size()!=0){nrc++;DF(i);}
if((nr!=0 and nr!=2)||(nrc>1))
fprintf(fout, "0");
else
{
fprintf(fout, "1\n");
if(nr == 2)
{
for(i=0; i<=9; ++i)
if(g[i].size()!=0 and g[i].size()%2)
if(!incep)
incep = i;
// else
// sfarsit = i;
//else;
rotult=1;
stiva.push(incep);
for(i=0; i<=n; ++i)
if(arc[i].inc == incep)
//and arc[i].sf == sfarsit or arc[i].sf == incep and arc[i].inc == sfarsit)
{
viz[i] = true;
rotire.push(0);
ans.push(i);
sfarsit=arc[i].sf;
break;
}
else
if(arc[i].sf == incep)
//and arc[i].sf == sfarsit or arc[i].sf == incep and arc[i].inc == sfarsit)
{
viz[i] = true;
rotire.push(1);
ans.push(i);
sfarsit=arc[i].inc;
break;
}
// if(g[incep].size() > g[sfarsit].size())
//{
// stiva.push(incep);
// if(arc[ultimalat].inc == incep)
// rotult = 0;
// else
rotult = 1;
// }
// else
// {
// stiva.push(sfarsit);
// if(arc[ultimalat].inc == sfarsit)
// rotult = 0;
// else
// rotult = 1;
// }
//
i=sfarsit;
}
else
{
i = 0;
while(g[i].empty())
++i;}
stiva.push(i);
// fprintf(fout,"%d %d\n",stiva.size(),i);
while(!stiva.empty())
{
nod = stiva.top();
if(g[nod].size())
{
lat = g[nod].back();
g[nod].pop_back();
if(!viz[lat])
{
if(nod == arc[lat].inc)
{
rotire.push(0);
ans.push(lat);
stiva.push(arc[lat].sf);
}
else
{
rotire.push(1);
ans.push(lat);
stiva.push(arc[lat].inc);
}
viz[lat] = true;
}
else;
}
else
{
if(!ans.empty())
{
fprintf(fout, "%d %d\n", ans.top(),!rotire.top());
ans.pop();
rotire.pop();
}
stiva.pop();
}
}//while
// if(nr == 2)
// fprintf(fout, "%d %d", ultimalat,rotult);
}
fclose(fin);
fclose(fout);
return 0;
}