Cod sursa(job #2491502)

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

using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
const int N=100010;
const int M=500010;
int n,m,k,cnt,c[N],viz[M],a[M],b[M];
vector<int>v[N];
bitset<N>used;
void dfs(int),sorteaza(vector<int>&),solve(int);
int main()
{
    f>>n>>m;
    for(;m;m--)
    {
        int x,y;
        f>>x>>y;
        if(x==y)
        {
            c[x]++;
        }
        else
        {
            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)
        {
            g<<"-1";
            return 0;
        }

    dfs(1);
    if(cnt<n)
    {
        g<<"-1";
        return 0;
    }
    for(int i=1;i<=n;i++)
    {
        sorteaza(v[i]);

    }
    solve(1);
    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)
{

    for(int i=c[nod];i;i--)
        g<<nod<<' ';
    c[nod]=0;
    while(v[nod].size()&&viz[v[nod].back()]==2)
        v[nod].pop_back();
    if(v[nod].size()==0)
        exit(0);
    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--;
        }
    }
}