Cod sursa(job #2491509)

Utilizator teodorgTeodor G teodorg Data 12 noiembrie 2019 18:07:44
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 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,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;
        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)
{
    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--;
        }
    }
}