Cod sursa(job #1199836)

Utilizator ArchazeyBaltatu Andrei-Mircea Archazey Data 20 iunie 2014 20:29:21
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include<fstream>
#include<vector>
#include<bitset>
using namespace std;

ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");

const int NMAX=100005;
const int MMAX=500005;

int n,m,st[MMAX],dr[MMAX],ciclu[MMAX];
vector<int>graf[NMAX];
bitset<MMAX>viz;

//st[i]=capatul stang al muchiei i
//dr[i]=capatul drept al muchiei i

inline void Citire()
{
    int i;
    fin>>n>>m;
    for (i=1;i<=m;i++)
        {
            fin>>st[i]>>dr[i];
            graf[st[i]].push_back(i);
            graf[dr[i]].push_back(i);
        }
}

inline void Con(int x)
{
    int i,len;
    viz[x]=1;
    len=graf[x].size();
    for (i=0;i<len;i++)
        if (!viz[st[graf[x][i]]+dr[graf[x][i]]-x])
            Con(st[graf[x][i]]+dr[graf[x][i]]-x);//ma duc in celalalt capat al muchiei
}

inline bool Conexitate()
{
    Con(1);
    int i;
    for (i=1;i<=n;i++)
        if (!viz[i]) return 0;
    return 1;
}

inline bool EsteEulerian()
{
    int i;
    for (i=1;i<=n;i++)
        if (graf[i].size()&1) return 0;
    return 1;
}

inline void DFS(int x)
{
    int i,len;
    len=graf[x].size();
    for (i=0;i<len;i++)
        if (!viz[graf[x][i]])//daca muchia prezenta nu este vizitata
            {
                viz[graf[x][i]]=1;//o vizitam
                DFS(st[graf[x][i]] + dr[graf[x][i]]-x);//mergem in celalalt capat al muchiei
            }
    ciclu[++ciclu[0]]=x;
}

int main()
{
    Citire();
    if (Conexitate() && EsteEulerian())
        {
            for (int i=1;i<=m;i++) viz[i]=0;
            DFS(1);
            for (int i=1;i<=ciclu[0];i++) fout<<ciclu[i]<<" ";
        }
    else fout<<"-1";
    fout<<"\n";
    return 0;
    return 0;
}