Cod sursa(job #928174)

Utilizator maritimCristian Lambru maritim Data 26 martie 2013 12:07:20
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<stdio.h>
#include<vector>
using namespace std;

FILE *f = fopen("ciclueuler.in","r");
FILE *g = fopen("ciclueuler.out","w");

#define MaxN 100100
#define MaxM 500100

int N,M;
vector<pair<int,int> > A[MaxN];
int SolV[MaxM];
int viz[MaxM],St[MaxM],StPoz[MaxM];

void citire(void)
{
    int a,b;

    fscanf(f,"%d %d",&N,&M);
    for(int i=1;i<=M;i++)
    {
        fscanf(f,"%d %d",&a,&b);
        A[a].push_back(make_pair(b,i));
        A[b].push_back(make_pair(a,i));
    }
}

void euler(void)
{
    int k = 1;

    St[k] = 1;
    StPoz[k] = 0;

    for(;k;StPoz[k]++)
    {
        //printf("%d ",k);
        if(StPoz[k] < A[St[k]].size())
        {
            if(!viz[A[St[k]][StPoz[k]].second])
            {
            //    printf("%d %d\n",St[k],A[St[k]][StPoz[k]].first);
                viz[A[St[k]][StPoz[k]].second] = 1;
                St[k+1] = A[St[k]][StPoz[k]].first;
                StPoz[++k] = -1;
            }
        }
        else
        {
            //printf("%d ",St[k]);
            SolV[++SolV[0]] = St[k--];
        }
    }
}

int main()
{
    citire();
    euler();

    for(int i=1;i<SolV[0];i++)
        fprintf(g,"%d ",SolV[i]);
}