Pagini recente » Cod sursa (job #1380246) | Cod sursa (job #2949201) | Cod sursa (job #1406677) | Cod sursa (job #2578147) | Cod sursa (job #495833)
Cod sursa(job #495833)
#include <algorithm>
#include <fstream>
#include <vector>
#include <queue>
#define Nmax 100003
typedef unsigned int uint;
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
int gr[Nmax],c[Nmax],ce[500002],viz[Nmax],p = 1, u = 1, nr,N,M,z;
bool ok;
vector<int> a[Nmax];
queue <int> Q;
void ciclu(int x)
{ nr = 1,c[1] = x,ok = true;
for (int i = 0;ok && (size_t) i < a[x].size(); i++)
{ z = a[x][i];gr[x]--;
vector<int>::iterator j = find(a[z].begin(), a[z].end(), x);
if (a[x][i] !=c[1])
{ nr++,c[nr] = a[x][i];
gr[a[x][i]]--,a[z].erase(j),a[x].erase(a[x].begin());
x = z,i=-1;
}
else
{ ok = false;
gr[c[1]]--,a[z].erase(j),a[x].erase(a[x].begin());
c[++nr] = c[1];
}
}
}
void inser()
{ for (int i = u; i >= p + 1; i--)
ce[i + nr -1] = ce[i];
for (int i = 2; i <= nr; i++)
ce[p + i - 1] = c[i];
}
void df(int k)
{ int s , v;
Q.push(1),viz[1]=true;
while(!Q.empty() ) {
v = Q.front(),Q.pop(),viz[v] = true;
for(s=0;(size_t)s<a[v].size();s++)
if ( !viz[a[v][s]] )
Q.push(a[v][s]);
}
}
int main()
{
f>>N>>M;
int x, y;
for (int i = 1; i <= M; i++)
{ f>>x>>y;
a[x].push_back(y),a[y].push_back(x);
gr[x]++,gr[y]++;
}
df(1);
for (int i = 1; i <= N; i++)
if ((viz[i] == 0 && gr[i] != 0) || gr[i] % 2)
{ g<<-1;return 0;}
ce[1] = 1;
while (p <= u)
{ if (gr[ce[p]] > 0)
ciclu(ce[p]),inser(),u += nr - 1;
else
p++;
}
for (int i = 1; i <= u-1; i++)
g<<ce[i]<<' ';
return 0;
}