Cod sursa(job #1518222)

Utilizator ZimmyZimmermann Erich Zimmy Data 5 noiembrie 2015 19:13:31
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>
#include <vector>
#include <bitset>
#include <stack>
#define N 100010
#define M 200010
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
vector<int> v[N];
int n,m,x,y,i,k,gr[N],a[M],b[M];
bitset<M> viz;
void df(int),DF(int);
stack<int> s;
int main()
{
    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>a[i]>>b[i];
        v[a[i]].push_back(i);
        v[b[i]].push_back(i);
        gr[a[i]]++;gr[b[i]]++;
    }
    for(i=1;i<=n;i++)
        if(gr[i]%2)
        {
            g<<"-1\n";
            return 0;
        }
    k=n;
    df(1);
    if(k)
        {
            g<<"-1\n";
            return 0;
        }
    s.push(1);viz.reset();
    while(s.size()>1||m)
    {
        x=s.top();
        if(gr[x]==0){g<<x<<' ';m--;s.pop();continue;}
        if(viz[v[x].back()]){v[x].pop_back();continue;}
        k=v[x].back();viz[k]=1;y=a[k]+b[k]-x;s.push(y);gr[x]--;gr[y]--;
    }
    return 0;
}
void df(int nod)
{
    viz[nod]=1;k--;
    for(auto it:v[nod])
        if(!viz[a[it]+b[it]-nod])
            df(a[it]+b[it]-nod);
}