Cod sursa(job #1112857)

Utilizator svladScurtu Vlad svlad Data 20 februarie 2014 08:42:17
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include<fstream>
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
using namespace std;
ifstream f("euler.in");
ofstream g("euler.out");
int d[100005],v[100005],w[100005],n,m,a[10005][10005],p,q,S;
void citire()
{
    int i,x,y;
    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>x>>y;
        a[x][y]++;
        a[y][x]++;
        d[x]++;
        d[y]++;
        S=S+2;
    }
}
int next(int x)
{
    int i;
    for(i=1;i<=n;i++)
    {
        if(a[i][x]>0) return i;
    }
}
void ciclu(int x)
{
    int K=0,i,y,z;
    w[++K]=x;
    y=next(x);
    while(y!=x)
    {
        z=w[K];
        w[++K]=y;
        d[y]--;
        d[z]--;
        a[y][z]--;
        a[z][y]--;
        S=S-2;
        y=next(w[K]);
    }
    q=K;
}
void inserare(int poz)
{
    int i,j;
    for(i=p;i>=poz+1;i--) v[i+q]=v[i];
    for(i=1,j=poz;i<=q;i++,j++) v[j]=w[i];
    p=p+q-1;
}
void eulerian()
{
    int i,poz,vf;
    ciclu(1);
    memcpy(v,w,(q+1)*sizeof(int));
    p=q;
    while(S!=0)
    {
        for(i=1;i<=p;i++)
        if(d[v[i]]!=0)
        {
            poz=i;
            vf=v[i];
            break;
        }
        ciclu(vf);
        inserare(poz);
    }
}
int main()
{
    citire();
    eulerian();
    int i;
    for(i=1;i<=p;i++) g<<v[i]<<" ";
    return 0;
}