Cod sursa(job #492966)

Utilizator andra23Laura Draghici andra23 Data 16 octombrie 2010 16:18:42
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include<fstream>
#include<vector>
#define maxn 100005

using namespace std;

int grad [maxn], viz[maxn], s[500010], c[maxn], ms[500010];
vector< pair<int,int> > v[maxn];

void dfs (int nod){
    viz[nod] = 1;
    for (int i = 0; i < v[nod].size(); i++)
        if (viz[v[nod][i].first] == 0)
            dfs(v[nod][i].first); 
}

int main(){
    ifstream f("ciclueuler.in");
    ofstream g("ciclueuler.out");
    int m, n;
    f>>n>>m;
    int i, j, k, x, y;
    
    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]++;    
    }
    
    int cod = 1;
    for (i = 1; i <= n; i++)
        if (grad[i] % 2 == 1){
            cod = -1;
            break;
        }
    
    if (cod == 1) 
        dfs(1);
    
    for (i = 1; i <= n; i++)
        if (viz[i] == 0){
            cod = -1;
            break;
        }
        
    if (cod == -1){
        g<<cod<<'\n';
    }
    else {
        int vf = 1;
        s[1] = 1;
        while (vf > 0){
            x = s[vf];
            while (c[x] < v[x].size() && ms[v[x][c[x]].second] == 1)
                c[x]++;
            if (c[x] >= v[x].size()){
                g<<x<<" ";
                vf--;    
            }
            else {
                ms[v[x][c[x]].second] = 1;
                vf++;
                s[vf] = v[x][c[x]].first;
            }
        }       
    }
    
    return 0;   
}