Cod sursa(job #1332230)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 1 februarie 2015 20:21:54
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <cstdio>
#include <vector>
#define Nmax 100005
#define Mmax 500005

using namespace std;

struct Edge
{
    int nod,poz;
};
vector <Edge> L[Nmax];
bool vizedge[Mmax],fr[Nmax];
int n,x,y,grad[Nmax],sol[Mmax],lensol,nrviz;

inline void Dfs1(int nod)
{
    fr[nod]=true; ++nrviz;
    vector <Edge> ::iterator it;
    for(it=L[nod].begin();it!=L[nod].end();++it)
        if(!fr[it->nod]) Dfs1(it->nod);
}

inline bool Euler()
{
    int i;
    for(i=1;i<=n;++i)
        if(grad[i]&1) return false;
    Dfs1(1);
    if(nrviz<n) return false;
    return true;
}

inline void Dfs(int nod)
{
    vector <Edge> ::iterator it;
    for(it=L[nod].begin();it!=L[nod].end();++it)
        if(!vizedge[it->poz])
        {
            vizedge[it->poz]=true;
            Dfs(it->nod);
        }
    sol[++lensol]=nod;
}

int main()
{
    int i,m,x,y;
    Edge w;
    freopen ("ciclueuler.in","r",stdin);
    freopen ("ciclueuler.out","w",stdout);
    scanf("%d%d", &n,&m);
    for(i=1;i<=m;++i)
    {
        vizedge[i]=false;
        scanf("%d%d", &x,&y);
        ++grad[x]; ++grad[y];
        w.nod=y; w.poz=i; L[x].push_back(w);
        w.nod=x; w.poz=i; L[y].push_back(w);
    }
    if(!Euler())
    {
        printf("-1\n");
        return 0;
    }
    Dfs(1);
    for(i=1;i<=m;++i) printf("%d ", sol[i]);
    return 0;
}