Cod sursa(job #1027430)

Utilizator pintilie.andreiPintilie pintilie.andrei Data 12 noiembrie 2013 19:43:41
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include<cstdio>
#define nmax 100*1001
#define mmax 1000*1001

using namespace std;

FILE *fin,*fout;

void adauga(int,int,int);
void verificare();
void dfs(int);

struct stiva{int x; int ul;} s[mmax];
struct lista{int n,p;int pl;char v;} l[mmax]; //v daca e viziat sau nu
struct nod{int p,g;} n[nmax];

int nr,mr;

int main()
{
    fin=fopen("ciclueuler.in","r");
    fout=fopen("ciclueuler.out","w");

    int i,x,y;

    fscanf(fin,"%d%d",&nr,&mr);
    for(i=1;i<=mr;i++)
        {
        fscanf(fin,"%d%d",&x,&y); //citim muchia
        adauga(2*i-1,x,y); //adaugam muchia dintre x si y
        }
    verificare();
    return 0;
}

void adauga(int m, int x , int y)
{
    l[m].n=y; l[m].p=n[x].p; n[x].p=m; l[m].pl=++m; //adaugam arcul (x,y)
    l[m].n=x; l[m].p=n[y].p; n[y].p=m; l[m].pl=m-1; //adaugam arcul (y,x)
    n[x].g++; n[y].g++; //crestem gradele
}

void verificare()
{
    int i;
    for(i=1;i<=nr;i++)
        if(n[i].g%2) //are grad impar
            break; //oprim
    if(i<=nr) printf("-1"); //inseamna ca nu poate forma un ciclu eulerian
    else dfs(1); //inseamna k se poate forma, deci facem parcurgerea dfs
}

void dfs(int x)
{
    int p=1; //capatul superior al stivei
    s[p].x=x; s[p].ul=n[x].p; //initializam stiva
    while(p) //cat timp avem elemente in stilva
        {
        for( ;s[p].ul;s[p].ul=l[s[p].ul].p) //parcurgem copii ramasi neparcursi
            if(!l[s[p].ul].v) //daca muchia nu a mai fost parcursa
                {
                l[l[s[p].ul].pl].v=l[s[p].ul].v=1; //marcam muchia ca vizitata (pe ambele sensuri)
                p++; s[p].x=l[s[p-1].ul].n; s[p].ul=n[s[p].x].p; //adaugam nodul in stiva
                break; //oprim pentru moment nodul curent
                }
        if(!s[p].ul) { if(p>1) printf("%d ",s[p].x); p--; } //inseamna k trebuie sa revenim o pozitie din stiva, deci afisem nodul
        }
}