Cod sursa(job #2491522)

Utilizator teodorgTeodor G teodorg Data 12 noiembrie 2019 18:25:22
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.02 kb
#include <bits/stdc++.h>

using namespace std;
//ifstream f("ciclueuler.in");
//ofstream g("ciclueuler.out");
const int N=100010;
const int M=500010;
///char buff[32010];
int n,m,k,cnt,viz[M],a[M],b[M];
vector<int>v[N];
bitset<N>used;
void dfs(int),sorteaza(vector<int>&);//,solve(int);
int main()
{
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);
    scanf("%d%d",&n,&m);//f>>n>>m;
    for(int i=1; i<=m; i++)
    {
        int x,y;
        scanf("%d%d",&y,&x);//f>>x>>y;
        a[++k]=x;
        b[k]=y;
        v[x].push_back(k);
        v[y].push_back(k);
    }
    for(int i=1; i<=n; i++)
        if(v[i].size()%2)
        {
            printf("-1\n");//g<<"-1";
            return 0;
        }

    dfs(1);
    if(cnt<n)
    {
        printf("-1\n");//g<<"-1";
        return 0;
    }
    for(int i=1; i<=n; i++)
        sorteaza(v[i]);
    int nod=1;
    while(m)
    {
        while(v[nod].size()&&viz[v[nod].back()]==2)
            v[nod].pop_back();
        if(v[nod].size()==0)
            return 0;
        printf("%d ",nod);//g<<nod<<' ';
        int e=v[nod].back();m--;
        viz[e]=2;
        nod=a[e]+b[e]-nod;
    }
    return 0;
}
void dfs(int nod)
{
    used[nod]=1;
    cnt++;
    for(auto it:v[nod])
    {
        int vec=a[it]+b[it]-nod;
        if(!used[vec])
        {
            dfs(vec);
            viz[it]=1;
        }
    }
}
//void solve(int nod)
//{
//    while(v[nod].size()&&viz[v[nod].back()]==2)
//        v[nod].pop_back();
//    if(v[nod].size()==0)
//        exit(0);
//    printf("%d ",nod);//g<<nod<<' ';
//    int e=v[nod].back();
//    viz[e]=2;
//    nod=a[e]+b[e]-nod;
//    solve(nod);
//}
void sorteaza(vector<int> &u)
{
    int st=0;
    int dr=u.size()-1;
    while(st<dr)
    {
        if(viz[u[st]]==1)
            st++;
        else if(viz[u[dr]]==0)
            dr--;
        else
        {
            swap(u[st],u[dr]);
            st++;
            dr--;
        }
    }
}