Cod sursa(job #1442444)

Utilizator petremariaPetre Maria petremaria Data 25 mai 2015 14:52:05
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <iostream>
#include <fstream>
#include <vector>
#define MAX 100005
using namespace std;
vector <int> vec[MAX];
int q[10*MAX],st[10*MAX],gr[MAX],v[MAX];
int n,m,varf;
int poz;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
void cr()
{
    f>>n>>m;
    int i,x,y;
    for(i=1; i<=m; i++)
    {
        f>>x>>y;
        vec[x].push_back(y);
        vec[y].push_back(x);
        gr[x]++;
        gr[y]++;
    }
}

void dfs(int k)
{
    v[k]=1;
    for(int i=0; i<vec[k].size(); i++)
        if(!v[vec[k][i]])
            dfs(vec[k][i]);

}

int conex()
{
    int i;
    dfs(1);
    for(i=1; i<=n; i++)
        if(v[i]==0)
            return 0;

    return 1;
}

int grad()
{
    int i;
    for(i=1; i<=n; i++)
        if(gr[i]%2==1)
            return 0;

    return 1;
}

void euler()
{
    int i,j,k;
    varf=1;
    st[varf]=1;
    while(varf>0)
    {

        k=st[varf];
        while(vec[k].size()>0)
        {
            i=vec[k][0];
            swap(vec[k][0],vec[k][vec[k].size()-1]);
            vec[k].pop_back();

            //for(j=0; j<vec[i].size() && vec[i][j]!=k; j++)

              //  swap(vec[i][j],vec[i][vec[i].size()-1]);
                vec[i].pop_back();

            st[++varf]=i;
            k=st[varf];
        }
        varf--;
        q[++poz]=k;
    }

}
int main()
{
    cr();
    if(conex() && grad())
        {
            euler();
        for(int i=1; i<=poz; i++)
            g<<q[i]<<" ";
        }
    return 0;
}