Cod sursa(job #2290405)

Utilizator lucaperjuLuca Perju Verzotti lucaperju Data 26 noiembrie 2018 15:06:15
Problema Ciclu Eulerian Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
#include <vector>
#include <unordered_map>
using namespace std;
ifstream cin ("ciclueuler.in");
ofstream cout ("ciclueuler.out");
int viz[100003],rez[1000003],n,m,grad[100003],k;
unordered_map <int,int> ok;
vector <int> v[100003];
void citire()
{
    cin>>n>>m;
    int i;
    for(i=1;i<=m;++i)
    {
        int a,b;
        cin>>a>>b;
        ++grad[b];
        ++grad[a];
        ++ok[a*(n+1)+b];
        ++ok[b*(n+1)+a];
        v[a].push_back(b);
        v[b].push_back(a);
    }
}
void dfs (int poz)
{
    viz[poz]=1;
    for(int i=0;i<v[poz].size();++i)
    {
        int nn=v[poz][i];
        if(!viz[nn])
            dfs(nn);
    }
}
bool verif ()
{
    int i,cnt=0;
    for(i=1;i<=n;++i)
        if(grad[i]%2)
            return false;
    for(i=1;i<=n;++i)
    {
        if(!viz[i])
        {
            dfs(i);
            ++cnt;
        }
    }
    if(cnt!=1)
        return false;
    return true;
}
void euler (int poz)
{
    for(int i=0;i<v[poz].size();++i)
    {
        int nn=v[poz][i];
        if(!ok[poz*(n+1)+nn])
            continue;
        ok[poz*(n+1)+nn]--;
        ok[nn*(n+1)+poz]--;
        euler(nn);
    }
    rez[++k]=poz;
}
int main()
{
    citire();
    if(verif()==0)
        cout<<-1;
    else
        euler(1);
    for(int i=1;i<k;++i)
        cout<<rez[i]<<' ';
    return 0;
}