Cod sursa(job #1897262)

Utilizator alex99Chelba Alexandru alex99 Data 1 martie 2017 12:01:59
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
int n,m,viz[100001];
vector<int> v[100001];
void df(int k)
{
    viz[k]=1;
    for(int i=0;i<v[k].size();i++)
        if(viz[v[k][i]]==0) df(v[k][i]);
}
int conex()
{
    df(1);
    for(int i=1;i<=n;i++)
        if(viz[i]==0) return 0;
    return 1;
}
int euler()
{
    if(!conex()) return 0;
    return 1;
}
void ciclu(int k)
{
    int maxx=0;
    int nmax=0;
    g<<k<<" ";
    for(int i=0;i<v[k].size();i++)
    {
        if(v[v[k][i]].size()>maxx)
        {
            maxx=v[v[k][i]].size();
            nmax=i+1;
        }
    }
    ///g<<nmax<<" "<<v[k][nmax-1]<<'\n';
    if(nmax)
    {
        int w=v[k][nmax-1];
        v[k].erase(v[k].begin()+nmax-1);
        v[v[k][nmax-1]].erase(find(v[v[k][nmax-1]].begin(),v[v[k][nmax-1]].end(),k));
        ciclu(w);
    }
}
int main()
{
    f>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int x,y;
        f>>x>>y;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    for(int i=1;i<=n;i++)
        if(v[i].size()%2==1) {g<<"-1"<<'\n'; return 0;}
    if(euler()) ciclu(1); else g<<"-1"<<'\n';
    return 0;
}