Cod sursa(job #2269023)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 25 octombrie 2018 17:23:49
Problema Ciclu Eulerian Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#define DIMN 100001
using namespace std;
vector <pair <int,int> > v[DIMN];
int f[DIMN],fi[DIMN];
int q[DIMN];
void dfs (int nod){
    int i,vecin;
    f[nod]=1;
    for (i=0;i<v[nod].size();i++){
        vecin=v[nod][i].first;
        if (!f[vecin]){
            dfs (vecin);
        }
    }
}
int main()
{
    FILE *fin=fopen ("ciclueuler.in","r");
    FILE *fout=fopen ("ciclueuler.out","w");
    int n,m,i,x,y,inc,nod,vecin,elem,ok;
    fscanf (fin,"%d%d",&n,&m);
    for (i=1;i<=m;i++){
        fscanf (fin,"%d%d",&x,&y);
        v[x].push_back(make_pair(y,i));
        v[y].push_back(make_pair(x,i));
        fi[x]++;
        fi[y]++;
    }
    for (i=1;i<=n;i++){
        if (fi[i]){
            dfs(i);
            inc=i;
            break;
        }
    }
    for (i=1;i<=n;i++){
        if (v[i].size()%2==1 || (fi[i] && f[i]==0)){
            fprintf (fout,"-1");
            return 0;
        }
        f[i]=0;
    }
    q[1]=inc;
    ok=0;
    elem=1;
    while (elem){
        nod=q[elem];
        if (fi[nod]==0){
            // am luat toate muchiile care au legatura cu el, il afisez
            if (ok){
                fprintf (fout,"%d ",nod);
                elem--;
                continue;
            }
            else {
                ok=1;
                elem--;
                continue;
            }
        }
        while (v[nod].size() && f[v[nod].back().second]==1)
            v[nod].pop_back();
        vecin=v[nod].back().first;
        fi[nod]--;
        fi[vecin]--; // elimin muchia nod->vecin
        f[v[nod].back().second]=1;
        v[nod].pop_back();
        q[++elem]=vecin;
    }
    return 0;
}