Cod sursa(job #1384496)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 11 martie 2015 10:00:57
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>
#include <vector>
#include <stack>
#include <bitset>
#define nmax 100005
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
vector <pair <int,int> > v[nmax];
stack <int> s;
bitset <nmax*5> uz;
int n,m,grad[nmax],st,nod;

void dfs(int nod)
{
    int i;
    uz[nod]=1;
    for (i=0;i<v[nod].size();i++) {
        if (uz[v[nod][i].first]==0) {
            dfs(v[nod][i].first);
        }
    }
}
int main()
{
    int i,j,x,y,siz;
    f>>n>>m;
    for (i=1;i<=m;i++) {
        f>>x>>y;
        v[x].push_back(make_pair(y,i));
        v[y].push_back(make_pair(x,i));
        grad[x]++;
        grad[y]++;
    }
    for (i=1;i<=n;i++) {
        st=i;
        dfs(i);
        break;
    }
    for (i=1;i<=n;i++)
        if ((uz[i]==0&&grad[i]!=0)||(grad[i]%2==1)) {
            g<<-1<<'\n';
            return 0;
        }
    uz.reset();
    s.push(st);
    int first=1;
    while (!s.empty()) {
        nod=s.top();
        if (grad[nod]==0) {
            if (!first) {
                g<<nod<<' ';
            }
            first=0;
            s.pop();
            continue;
        }
        while (uz[v[nod][v[nod].size()-1].second]==1)
            v[nod].erase(v[nod].end()-1);
        siz=v[nod].size();
        uz[v[nod][siz-1].second]=1;
        s.push(v[nod][siz-1].first);
        grad[nod]--;
        grad[v[nod][siz-1].first]--;
        v[nod].erase(v[nod].end()-1);
    }
    return 0;
}