Pagini recente » Cod sursa (job #1537518) | Cod sursa (job #3030879) | Cod sursa (job #1387321) | Cod sursa (job #202563) | Cod sursa (job #363550)
Cod sursa(job #363550)
/*Problema ciclu eulerian de pe infoarena
arhiva educationala 40 puncte
*/
#include<fstream>
#include<stdlib.h>
#define nmax 10010
#define mmax 500010
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
short int a[nmax][nmax];
int ciclu[mmax],gr[nmax],k,n,m,c1[mmax];
void citire()
{int i,x,y;
fin>>n>>m;
for(i=1;i<=m;i++)
{fin>>x>>y;
gr[x]++;
gr[y]++;
a[x][y]++;
a[y][x]++;
}
}
void det_ciclu_eulerian()
{int i,k1,poz,ok=0;
k=1;
ciclu[1]=1;
do
{ok=0;
for(i=1;i<=n;i++)
if(a[ciclu[k]][i]!=0)
{ciclu[k+1]=i;
gr[ciclu[k]]--;
ok=1;
gr[ciclu[k+1]]--;
a[ciclu[k+1]][ciclu[k]]--;
a[ciclu[k]][ciclu[k+1]]--;
k++;
break;
}
if(ok==0) {fout<<"-1";
exit(0);
}
}while(ciclu[k]!=ciclu[1]);
while(k<=m)
{for(i=1;i<=k;i++)
if(gr[ciclu[i]]!=0)
break;
k1=1;
c1[k1]=ciclu[i];
poz=i;
do
{ok=0;
for(i=1;i<=n;i++)
if(a[c1[k1]][i]!=0)
{c1[k1+1]=i;
gr[c1[k1]]--;
ok=1;
gr[c1[k1+1]]--;
a[c1[k1+1]][c1[k1]]--;
a[c1[k1]][c1[k1+1]]--;
k1++;
break;
}
if(ok==0) {fout<<"-1";
exit(0);
}
}while(c1[k1]!=c1[1]);
//concatenez
for(i=k;i>poz;i--)
ciclu[i+k1-1]=ciclu[i];
for(i=2;i<=k1;i++)
ciclu[poz+i-1]=c1[i];
k=k+k1-1;
}
}
void afisare()
{int i;
for(i=1;i<=m+1;i++)
fout<<ciclu[i]<<" ";
}
int main()
{citire();
det_ciclu_eulerian();
afisare();
fin.close();
fout.close();
return 0;
}