Cod sursa(job #982941)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 10 august 2013 15:08:56
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include<fstream>
#include<vector>
#define Nmax 100099
#define Mmax 500099
#define x first
#define y second
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
int n,m,sol[Mmax];
//struct muchie{int x,y}Much;
bool viz[Mmax];
vector <int> Graph[Nmax];
vector <pair <int,int> >Much;

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

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

inline void Euler(int nod)
{
     //parcurg lista muchiilor incidente cu nod

    vector <int>::iterator it;
    for(it=Graph[nod].begin();it!=Graph[nod].end();it++)
        if(!viz[*it]) //daca muchia mai exista
        {
            viz[*it]=true; //o sterg
            //vizitez celalalt capat al muchiei
            Euler(Much[*it-1].x+Much[*it-1].y-nod);
        }
        //dupa ce nodul nod a ramas cu gradul 0,este pus in ciclu
    sol[++sol[0]]=nod;
}

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