Cod sursa(job #1219888)

Utilizator gapdanPopescu George gapdan Data 15 august 2014 16:14:14
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include<fstream>
#include<vector>
#include<stack>
#include<bitset>
#define NMAX 100001
#define MMAX 500001
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
struct graf
{
    int l,r;
};
vector<graf>v[100001];
bool viz[MMAX];
int d[NMAX],n,m,i,x,y,s;
stack<int>st;
graf add(int p,int t)
{
    graf X;
    X.l=p,X.r=t;
    return X;
}
void dfs(int nod)
{
    viz[nod]=1;
    vector<graf>::iterator it;
    for (it=v[nod].begin();it!=v[nod].end();++it)
        {
            graf X=*it;
            if (viz[X.l]==0) dfs(X.l);
        }
}
int main()
{
    f>>n>>m;
    for (i=1;i<=m;++i)
    {
        f>>x>>y;
        v[x].push_back(add(y,i));
        v[y].push_back(add(x,i));
        ++d[x];
        ++d[y];
    }
    for (i=1;i<=n;++i)
    {
        if (d[i]>0)
        {
            dfs(i);
            s=i;
            break;
        }
    }
    for (i=1;i<=n;++i)
        if ((viz[i]==0 && d[i]>0) || (d[i]%2==1))
        {
            g<<'-1';
            return 0;
        }
    for (i=1;i<=m;++i) viz[i]=0;
    int nod=1;
    st.push(s);
    while(!st.empty())
    {
        x=st.top();
        if (d[x]==0)
        {
            if (!nod) g<<x<<' ';
            nod=0;
            st.pop();
            continue;
        }
        while(viz[v[x][v[x].size()-1].r]==1)
            v[x].erase(v[x].end()-1);
        viz[v[x][v[x].size()-1].r]=1;
        st.push(v[x][v[x].size()-1].l);
        d[x]--;
        d[v[x][v[x].size()-1].l]--;
        v[x].erase(v[x].end()-1);
    }
    return 0;
}