Cod sursa(job #1133997)

Utilizator Daniel3717Aleca Daniel Adrian Daniel3717 Data 5 martie 2014 21:34:21
Problema Ciclu Eulerian Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.73 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
#define maxn 100005
vector <pair <int,int> > muchii[maxn];
queue <int> saferoad;
bool b[maxn];
int n,m,i,x,y,sz,to,where,now;

void conexdfs(int now)
{
    b[now]=true;

    int i,to;
    queue <int> q;
    q.push(now);
    while (!q.empty())
    {
        now=q.front();
        for (i=0;i<muchii[now].size();i++)
        {
            to=muchii[now][i].first;
            if (b[to]==false)
            {
                b[to]=true;
                q.push(to);
            }
        }
        q.pop();
    }

}

ofstream g("ciclueuler.out");

void go(int now)
{
    while (muchii[now].back().first==-1)
        muchii[now].pop_back();

    if (muchii[now].size()==0)
        return;

    to=muchii[now].back().first;
    where=muchii[now].back().second;

    muchii[to][where].first=-1;
    muchii[now].back().first=-1;
    g<<to<<' ';
    go(to);
}

int main(void)
{
    FILE * f;
    f=fopen("ciclueuler.in","r");
    fscanf(f,"%d%d",&n,&m);
    for (i=1;i<=m;i++)
    {
        fscanf(f,"%d%d",&x,&y);
        muchii[x].push_back(make_pair(y,muchii[y].size()));
        muchii[y].push_back(make_pair(x,muchii[x].size()-1));
    }

    conexdfs(1);
    for (i=1;i<=n;i++)
        if ((b[i]==false)||(muchii[i].size()==0)||(muchii[i].size()%2==1))
        {
            g<<"-1\n";
            return 0;
        }


    //saferoad.push(1);
    //sz=muchii[1].size();
    //saferoad.push(muchii[1][sz-1].first);

    //to=muchii[1][sz-1].first;
    //where=muchii[1][sz-1].second;
    //muchii[to][where].first=-1;
    //cout<<"Marked muchii["<<to<<"]["<<where<<"]\n";

    //muchii[1][sz-1].first=-1;
    //cout<<"Marked muchii["<<1<<"]["<<sz-1<<"]\n";

    //while (saferoad.back()!=1)
    //{
    //    now=saferoad.back();
    //    cout<<now<<' '<<muchii[now].size()<<'\n';
    //    while (muchii[now].back().first==-1)
    //    {
    //        //cout<<"Popped from "<<now<<" : "<<muchii[now][muchii[now].size()-1].first<<' '<<muchii[now][muchii[now].size()-1].second<<'\n';
    //        muchii[now].pop_back();
    //    }
    //    sz=muchii[now].size();
    //    to=muchii[now][sz-1].first;
    //    where=muchii[now][sz-1].second;

    //    muchii[now][sz-1].first=-1;
        //cout<<"Marked muchii["<<now<<"]["<<sz-1<<"]\n";
    //    muchii[to][where].first=-1;
        //cout<<"Marked muchii["<<to<<"]["<<where<<"]\n";

    //    saferoad.push(to);
    //}
    //while (saferoad.size()!=1)
    //{
    //    //cout<<now<<' ';
    //    now=saferoad.front();
    //    g<<now<<' ';
    //    go(now);
    //    saferoad.pop();
    //}

    go(1);

    return 0;
}