Cod sursa(job #1581955)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 27 ianuarie 2016 14:05:08
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include<fstream>
#include<vector>
#include<stack>
using namespace std;
int n, m, i, j, nod, vecin, x, y, ok;
int d[100005], viz[100005], f[500005];
vector< pair<int, int > > v[100005];
stack<int> s;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
void dfs(int nod){
    viz[nod] = 1;
    for(int i = 0; i < v[nod].size(); i++){
        int vecin = v[nod][i].first;
        if(viz[vecin] == 0){
            dfs(vecin);
        }
    }
}
int main(){
    fin>> n >> m;
    for(i = 1; i <= m; i++){
        fin>> x >> y;
        d[x]++;
        d[y]++;
        v[x].push_back( make_pair(y, i) );
        v[y].push_back( make_pair(x, i) );
    }
    for(i = 1; i <= n; i++){
        if(d[i] != 0){
            x = i;
            dfs(i);
            break;
        }
    }
    for(i = 1; i <= n; i++){
        if(d[i] != 0){
            if(viz[i] == 0 || d[i] % 2 == 1){
                fout<<"-1\n";
                return 0;
            }
        }
    }
    s.push(x);
    while(!s.empty()){
        nod = s.top();
        if(d[nod] == 0){
            if(ok == 0){
                ok = 1;
            }
            else{
                fout<< nod <<" ";
            }
            s.pop();
        }
        else{
            i = v[nod].size() - 1;
            while(f[ v[nod][i].second ] == 1){
                v[nod].pop_back();
                i--;
            }
            vecin = v[nod][i].first;
            d[nod]--;
            d[vecin]--;
            f[ v[nod][i].second ] = 1;
            v[nod].pop_back();
            s.push(vecin);
        }
    }
    return 0;
}