Cod sursa(job #1510563)

Utilizator UMihneaUngureanu Mihnea UMihnea Data 25 octombrie 2015 12:20:45
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define N 100010
#define M 500010
#define vec X[it]+Y[it]-nod
using namespace std;

ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");

vector<int> V[N];
int X[M], Y[M], n, m, i, k;
char F[M], viz[N];
void df(int);

int main()
{
    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>X[i]>>Y[i];
        V[X[i]].push_back(i);
        V[Y[i]].push_back(i);
    }
    df(1);
    for(i=1;i<=n;i++)
        for(int L=0,R=V[i].size()-1;L<R;)
        {
            while(F[V[i][L]]==1&&L<R)L++;
            while(F[V[i][R]]==0&&L<R)R--;
            if(L<R){swap(V[i][L], V[i][R]); L++; R--; }
        }
    k = 2*m-1;
    int nod = 1;
    while(1)
    {

        while(V[nod].size()&&F[V[nod].back()]==2)
        {
            V[nod].pop_back();
            k--;
        }
        if(!V[nod].size())break;
        g<<nod<<' ';
        i = V[nod].back();
        F[i]=2;
        V[nod].pop_back();k--;
        nod = X[i]+Y[i]-nod;

    }
    return 0;
}
void df(int nod)
{
    viz[nod] = 1;
    for(auto it:V[nod])
        if(!viz[vec])
        {
            F[it] = 1;
            df(vec);
        }
}