Cod sursa(job #1413327)

Utilizator koroalinAlin Corodescu koroalin Data 1 aprilie 2015 20:05:36
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include <cstdio>
#include <list>
#define NMAX 100001
using namespace std;
FILE* fin=fopen("ciclueuler.in","r");
FILE* fout=fopen("ciclueuler.out","w");
list <int> G[NMAX];
list <int> C1,C2;
int n,m,d[NMAX],total,uz[NMAX];
void citire();
int ciclu(int x,list <int> &C);
bool conex();
bool grade();
void dfs(int x);
int main()
{
    list<int>::iterator it,it1;
    citire();
    if (!(grade() && conex()))
    {
        fprintf(fout,"-1\n");
        return 0;
    }
    total=ciclu(1,C1);
    while (total<m)
    {
        for(it=C1.begin(); !d[*it]; it++);
        total+=ciclu(*it,C2);
        C1.insert(it,C2.begin(),C2.end());
        C2.clear();
    }
    for (it=C1.begin(); it!=C1.end(); it++) fprintf(fout,"%d ",*it);
    fprintf (fout,"\n");
    return 0;
}
void citire()
{
    int i,x,y;
    fscanf(fin,"%d %d",&n,&m);
    for (i=1; i<=m; i++)
    {
        fscanf(fin,"%d %d",&x,&y);
        G[x].push_back(y);
        G[y].push_back(x);
        d[x]++;
        d[y]++;
    }
}
int ciclu(int x,list <int> &C)
{
    int nr=0,y;
    list<int>::iterator it;
    C.push_back(x);
    do
    {
        y=G[x].front();
        C.push_back(y);
        d[x]--;
        d[y]--;
        G[x].pop_front();
        for (it=G[y].begin(); ; it++)
            if (*it==x)
            {
                G[y].erase(it);
                break;
            }
        x=y;
        nr++;
    }
    while (y!=C.front());
    C.pop_back();
    return nr;
}
bool grade()
{
    for (int i=1; i<=n; i++)
    {
        if(d[i]%2==1) return 0;
    }
    return 1;
}
bool conex()
{
    dfs(1);
    for (int i=1; i<=n; i++)
        if (!uz[i]) return 0;
    return 1;
}
void dfs(int x)
{
    uz[x]=1;
    list<int>::iterator it;
    for (it=G[x].begin(); it!=G[x].end(); ++it)
    {
        if (!uz[*it]) dfs(*it);
    }
}