Cod sursa(job #1134651)

Utilizator pauldinudinu paul pauldinu Data 6 martie 2014 20:12:44
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>
#include <vector>

using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
const int N=101001;
struct muchii {
    int x,y;
} v[N*5];
int n,m;

vector <int> a[N];
bool folosit[5*N],viz[N];
void citire() {
    f>>n>>m;
    for(int i=1; i<=m; i++) {
        f>>v[i].x>>v[i].y;
        a[v[i].x].push_back(i);
        a[v[i].y].push_back(i);
    }
}
void euler(int x) {
    int y,ind;
    for(int i=0; i<a[x].size(); i++) {
        ind=a[x][i];
        if(folosit[ind]) continue;
        y=v[ind].y;
        if(y==x) y=v[ind].x;
        folosit[ind] = true;
        euler(y);
    }
    g<<x<<" ";
}
bool pare()
{
    for(int i=1;i<=n;i++)
        if(a[i].size()%2==1) return 0;
    return 1;
}
void dfs(int x)
{
    int ind, y;
    viz[x]=true;
    for(int i=0;i<a[x].size();i++)
    {
        ind = a[x][i];
        y = v[ind].x;
        if (x == y) y = v[ind].y;
        if(!viz[y]) dfs(y);
    }
}
bool conex()
{
     for(int i=1;i<=n;i++)
        if(viz[i]==false) return 0;
     return 1;
}
int main() {
    int ok=1;
    citire();
    dfs(1);
    if (conex() && pare())
        ok = 1;
    else
        ok = 0;
    if(ok==1) euler(1);
    else g << "-1\n";
    return 0;
}