Cod sursa(job #833223)

Utilizator enedumitruene dumitru enedumitru Data 12 decembrie 2012 01:49:37
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
// Algoritmul lui Fleury
#include<fstream>
#include<vector>
using namespace std;
ifstream f("ciclueuler.in"); ofstream g("ciclueuler.out");
const int Nmax=100100, Mmax=500500;
int n,m,X[Mmax],Y[Mmax],sol[Nmax],nr;
bool viz[Mmax];
vector <int> G[Nmax];

inline void Citire()
{
    f>>n>>m;
    for(int i=1; i<=m; ++i)
    {
        f>>X[i]>>Y[i]; //citesc capetele muchiei i
        //pentru un nod x , G[x] reprezinta lista indicilor muchiilor incidente cu x
        G[X[i]].push_back(i);
        G[Y[i]].push_back(i);
    }
}

inline bool Eulerian()
{
    for(int i=1;i<=n;i++)
        if(G[i].size()%2==1)return false;  //daca gradul nodului i este impar,atunci graful nu este eulerian
    return true;
}

inline void Euler(int nod)
{
    vector <int>::iterator it;
    for(it=G[nod].begin();it!=G[nod].end();it++) //parcurg lista muchiilor incidente cu nod
    {
        if(!viz[*it]) //daca muchia mai exista
        {
            viz[*it]=true; //o sterg
            Euler(X[*it]+Y[*it]-nod); //vizitez celalalt capat al muchiei
        }
    }
    sol[++nr]=nod; //dupa ce nodul nod a ramas cu gradul 0,este pus in ciclu
}

int main()
{
    Citire();
    if(Eulerian())  //verific daca graful poate fi eulerian
    {
        Euler(1); //determin ciclul eulerian
        for(int i=1;i<=nr;i++) g<<sol[i]<<' '; //afisez ciclul eulerian gasit
        g<<"\n";
    }
    else g<<"-1\n"; //nu este graf eulerian
    return 0;
}