Pagini recente » Borderou de evaluare (job #60394) | Profil BlackNesta | Cod sursa (job #2309796) | Cod sursa (job #2511986) | Cod sursa (job #766252)
Cod sursa(job #766252)
#include<iostream>
#include<fstream>
#include<stack>
#include<list>
#include<bitset>
using namespace std;
#define NMAX 9
struct piesa {
int poz,d;
inline piesa (int _poz, int _d)
{
poz=_poz;
d=_d;
}
};
list <int> v[100001],a;
list <piesa> d[NMAX+1][NMAX+1];
int gr[100001],n,m,start,l;
bitset <100001> viz;
stack <int> s;
inline int conex()
{
int i,x,y;
x=-1;
y=-1;
for(i=1;i<=n;i++)
if(gr[i]%2==1) {
if(x==-1)
x=i;
else if(y==-1)
y=i;
else return 0;
}
if(x!=-1) {
v[x].push_back(y);
v[y].push_back(x);
}
return 1;
}
inline void sterge(int x, int y)
{
for(list <int> :: iterator it=v[x].begin();it!=v[x].end();it++)
if(*it==y) {
v[x].erase(it);
return;
}
}
inline void euler(int nod)
{
int x;
while(v[nod].empty()==0) {
x=v[nod].front();
v[nod].pop_front();
sterge(x,nod);
s.push(nod);
nod=x;
}
}
int main ()
{
int i,x,y,j;
ifstream f("domino.in");
ofstream g("domino.out");
f>>m;
start=-1;
n=0;
for(i=1;i<=m;i++) {
f>>x>>y;
if(start==-1)
start=x;
v[x].push_back(y);
v[y].push_back(x);
if(x>n)
n=x;
if(y>n)
n=y;
gr[x]++;
gr[y]++;
d[x][y].push_back(piesa(i,0));
d[y][x].push_back(piesa(i,1));
}
f.close();
if(conex()) {
do {
euler(start);
start=s.top();
s.pop();
a.push_back(start);
}while(s.empty()==0);
g<<"1"<<'\n';
a.push_back(a.front());
x=a.front();
list <int> :: iterator it=a.begin();
for( ++it ;it!=a.end();it++) {
g<<d[x][*it].front().poz<<" "<<d[x][*it].front().d<<'\n';
y=d[x][*it].front().poz;
d[x][*it].pop_front();
for(list <piesa> :: iterator itt=d[*it][x].begin();itt!=d[*it][x].end();itt++)
if(itt->poz==y) {
d[*it][x].erase(itt);
break;
}
x=*it;
}
}
else {
while(1);
g<<"0";
}
g.close();
return 0;
}