Cod sursa(job #1133970)

Utilizator Daniel3717Aleca Daniel Adrian Daniel3717 Data 5 martie 2014 21:13:41
Problema Ciclu Eulerian Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.38 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;
    for (i=0;i<muchii[now].size();i++)
    {
        to=muchii[now][i].first;
        if (b[to]==false)
            conexdfs(to);
    }
}

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();
        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)
    {
        now=saferoad.front();
        g<<now<<' ';
        go(now);
        saferoad.pop();
    }

    return 0;
}