Cod sursa(job #987884)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 21 august 2013 17:05:02
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include<fstream>
#include<vector>
using namespace std;
int n,m,X[500500],Y[500500],sol[500500],nr,siz[500500];
bool viz[500500];
vector <int> G[100100];
ofstream fout("ciclueuler.out");
 
inline void Citire()
{
    int i;
    ifstream fin("ciclueuler.in");
    fin>>n>>m;
    for(i=1;i<=m;i++)
    {
        fin>>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); siz[X[i]]++;
        G[Y[i]].push_back(i); siz[Y[i]]++;
    }
    fin.close();
}
 
inline bool Eulerian()
{
    int i;
    for(i=1;i<=n;i++)
        if(siz[i]%2==1) //daca gradul nodului i este impar,atunci graful nu este eulerian
            return false;
    return true;
}
 
inline void Euler(int nod)
{
    int i;
    while(siz[nod]) //parcurg lista muchiilor incidente cu nod
    {
		i=*(G[nod].end()-1);
		G[nod].pop_back();
		siz[nod]--;
        if(!viz[i]) //daca muchia mai exista
        {
            viz[i]=true; //o sterg
            Euler(X[i]+Y[i]-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();
    bool ok=Eulerian(); //verific daca graful poate fi eulerian
    if(!ok)
    {
        fout<<-1<<"\n"; //nu este graf eulerian
        fout.close();
        return 0;
    }
    else
    {
        int i;
        Euler(1); //determin ciclul eulerian
        for(i=1;i<=nr;i++)
            fout<<sol[i]<<' '; //afisez ciclul eulerian gasit
        fout<<"\n";
        fout.close();
    }
    return 0;
}