Cod sursa(job #1165150)

Utilizator span7aRazvan span7a Data 2 aprilie 2014 15:07:58
Problema Ciclu Eulerian Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include<cstdio>
#include<vector>
#define maxN 100001
using namespace std;
FILE *f=fopen("ciclueuler.in","r");
FILE *g=fopen("ciclueuler.out","w");
vector<int>L[maxN];
bool viz[maxN];
int t[maxN],d[maxN],n,m;
void citire()
{
    int i,x,y;
    fscanf(f,"%d%d",&n,&m);
    for(i=1;i<=m;i++)
    {
        fscanf(f,"%d%d",&x,&y);
        L[x].push_back(y);
        L[y].push_back(x);
        d[x]++;
        d[y]++;
    }
}
bool verif()
{   int i;
    for(i=1;i<=n;i++)
        if(viz[i]==0)return false;
    for(i=1;i<=n;i++)
        if(d[i]%2==1)return false;
    return true;

}
void df(int i)
{
    int j;
    viz[i]=true;
    for(j=0;j<L[i].size();j++)
        if(viz[L[i][j]]==false)
        {
            t[L[i][j]]=i;
            df(L[i][j]);
        }
}
void sterge(int x,int y)
{
    int j;
    for(j=0;j<L[x].size();j++)
        if(L[x][j]==y){L[x].erase(L[x].begin()+j);return;}
}
void euler(int i)
{
    int j,nodcur;
    for(j=0;j<L[i].size();j++)
        if(t[L[i][j]]!=i&&t[i]!=L[i][j])
        {
            nodcur=L[i][j];
            fprintf(g,"%d ",nodcur);
            L[i].erase(L[i].begin()+j);
            sterge(nodcur,i);
            euler(nodcur);
        }
    for(j=0;j<L[i].size();j++)
        if(t[L[i][j]]==i||t[i]==L[i][j])
        {
        nodcur=L[i][j];
        L[i].erase(L[i].begin()+j);
        fprintf(g,"%d ",nodcur);
        sterge(nodcur,i);
        euler(nodcur);
        }
}
int main()
{
    citire();
    df(1);
    bool ok=verif();
    if(ok==0)
        fprintf(g,"-1\n");
    else
    {
        fprintf(g,"1 ");
        euler(1);
        //afisare();
    }

    return 0;
}