Cod sursa(job #1338095)

Utilizator koroalinAlin Corodescu koroalin Data 9 februarie 2015 19:40:22
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.22 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()
{
    //int i;
    list<int>::iterator it,it1;
    citire();
    if (!(grade() && conex())) {fprintf(fout,"-1\n"); return 0;}
//    for (i=1; i<=n; i++)
//    {
//    for (it=G[i].begin(); it!=G[i].end(); it++)
//    fprintf(fout,"%d %d\n",i,*it);
//        //fprintf (fout,"\n");
//    }

    total=ciclu(1,C1);
//    for (it=C1.begin(); it!=C1.end(); it++)
//    fprintf(fout,"%d ",*it);
//        fprintf (fout,"\n");
    while (total<m)
    {
        for(it=C1.begin(); !d[*it]; it++);
        total+=ciclu(*it,C2);
//        for (it1=C2.begin(); it1!=C2.end(); it1++) fprintf(fout,"%d ",*it1);
//        fprintf (fout,"\n");
        C1.insert(it,C2.begin(),C2.end());
//        for (it1=C1.begin(); it1!=C1.end(); it1++) fprintf(fout,"%d ",*it1);
//        fprintf (fout,"\n");
        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);
    }
}