Cod sursa(job #1023729)

Utilizator dragosaioaneiAioanei Dragos dragosaioanei Data 7 noiembrie 2013 17:14:29
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <stdio.h>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
#define NMAX 100005
#define MMAX 500005
#define IN "ciclueuler.in"
#define OUT "ciclueuler.out"

int n,m; bool ok=true;
vector<int> graf[NMAX],ciclu;
stack<int> stiva;


void citire();
void verificare();
void rezolvare();
void afisare();

int main()
{
    citire();
    verificare();
    rezolvare();
    afisare();

    return 0;
}

void citire()
{
    FILE * fin=fopen(IN,"r");

    int i,x,y;
    fscanf(fin,"%d%d",&n,&m);
    for(i=1;i<=m;i++)
    {
        fscanf(fin,"%d%d",&x,&y);
        graf[x].push_back(y);
        graf[y].push_back(x);
    }

    fclose(fin);
}

void verificare()
{
    int i;
    for(i=1;i<=n;i++)
        if(graf[i].size()%2==1)
            afisare();
}

void rezolvare()
{
    int a,b;
    stiva.push(1);
    while(!stiva.empty())
    {
        a=stiva.top();
        if(!graf[a].empty())
        {
            b=graf[a].back();
            graf[a].pop_back();
            stiva.push(b);
            graf[b].erase(find(graf[b].begin(),graf[b].end(),a));
        }
        else
        {
            ciclu.push_back(a);
            stiva.pop();
        }
    }
}

void afisare()
{
    FILE * fout=fopen(OUT,"w");

    int i;
    if(ciclu.size()==0)
    {
        fprintf(fout,"-1\n");
        return;
    }
    fprintf(fout,"%d",ciclu[0]);
    for(i=1;i<ciclu.size();i++)
        fprintf(fout," %d",ciclu[i]);
    fprintf(fout,"\n");

    fclose(fout);
}