Mai intai trebuie sa te autentifici.
Cod sursa(job #1870213)
Utilizator | Data | 6 februarie 2017 14:53:35 | |
---|---|---|---|
Problema | Ciclu Eulerian | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 2.06 kb |
#include <cstdio>
using namespace std;
FILE *f, *g;
int n, m;
int k;
int rez;
int v[100001];
int lst[100001];
int nd[100001];
int urm[1000001];
int ant[1000001];
int nod[1000001];
void add(int a, int b)
{
k ++;
nod[k] = b;
urm[k] = lst[a];
ant[lst[a]] = k;
lst[a] = k;
nd[a] ++;
}
void readFile()
{
f = fopen("ciclueuler.in", "r");
fscanf(f, "%d%d", &n, &m);
int i;
int a, b;
for(i = 1; i <= m; i ++)
{
fscanf(f, "%d%d", &a, &b);
add(a, b);
add(b, a);
}
fclose(f);
}
int primulNod(int x)
{
int rez = lst[x];
lst[x] = urm[lst[x]];
nd[x] --;
return nod[rez];
}
void sterge(int a, int b)
{
int p;
nd[a] --;
for(p = lst[a]; p != 0; p = urm[p])
{
if(nod[p] == b)
{
if(p == lst[a])
{
lst[a] = urm[lst[a]];
return;
}
else
{
ant[p] = urm[p];
return;
}
}
}
}
int c[1000001];
void solve()
{
int i;
for(i = 1; i <= n && (rez != -1); i ++)
{
if(nd[i] % 2 == 1 || nd[i] == 0)
rez = -1;
}
int x, y;
if(rez == 0)
{
int st = 1, dr = 0;
c[++ dr] = 1;
while(st <= dr)
{
x = c[st];
while(nd[x] > 0)
{
y = primulNod(x);
c[++ dr] = y;
sterge(y, x);
x = y;
}
v[++ rez] = c[st];
st ++;
}
}
}
void printFile()
{
g = fopen("ciclueuler.out", "w");
if(rez == -1)
fprintf(g, "%d\n", rez);
else
{
int i;
for(i = 1; i <= rez; i ++)
fprintf(g, "%d ", v[i]);
fprintf(g, "\n");
}
fclose(g);
}
int main()
{
readFile();
solve();
printFile();
return 0;
}