Cod sursa(job #1338082)

Utilizator koroalinAlin Corodescu koroalin Data 9 februarie 2015 19:34:04
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <cstdio>
#include <forward_list>
#define NMAX 100001
using namespace std;
FILE* fin=fopen("ciclueuler.in","r");
FILE* fout=fopen("ciclueuler.out","w");
forward_list <int> G[NMAX];
forward_list <int> C1,C2;
int n,m,d[NMAX],total;
void citire();
int ciclu(int x,forward_list <int> &C);
int main()
{
    int i;
    forward_list<int>::iterator it,it1;
    citire();
//    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,forward_list <int> &C)
{
    int nr=0,y;
    forward_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;
}