Cod sursa(job #1242761)

Utilizator alex_mustaineDumitru Alex alex_mustaine Data 14 octombrie 2014 23:18:13
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
#include <fstream>
#include <vector>
using namespace std;
#define MAX 100001
int n, m;
int tata[MAX], gr[MAX];
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
vector <int> lista[MAX];
vector <pair<int, int>> muc;
vector <bool> arb;
void dfs(int nod);
void ciclu(int nod);
int main()
{
    int i, u, v, cp=0;

    fin>>n>>m;
    for(i=0; i<m; i++){
        fin>>u>>v;
        muc.push_back(make_pair(u, v));
        arb.push_back(false);
        lista[u].push_back(i);
        lista[v].push_back(i);
        gr[u]++; gr[v]++;
    }
    for(i=1; i<=n; i++)
        if(gr[i]%2==1){
            fout<<"-1\n";
            return 0;
    }
    for(i=1; i<=n; i++)
        if(tata[i]==0)
        {
            cp++;
            tata[i] = -1;
            dfs(i);
        }
    if(cp>1) {fout<<"-1\n"; return 0;}
    //for(i=0; i<m; i++)
        //if(arb[i]) fout<<i+1<<' ';
    ciclu(1);
    return 0;
}
void ciclu(int nod){
    int i, j, k, next;
    for(i=1; i<=n; i++){
        j=0; k=lista[i].size()-1;
        while(j<k){
            while(j<lista[i].size() and arb[lista[i][j]]) j++;
            while(k>=0 and !arb[lista[i][k]]) k--;
            if(j<k){
                swap(lista[i][j], lista[i][k]);
                j++; k--;
            }
        }
    }
    for(i=1; i<=m; i++)
    {
        fout<<nod<<' ';
        do{
            j = lista[nod].back();
            lista[nod].pop_back();
            next = muc[j].first;
            if(next==nod) next = muc[j].second;
            muc[j].first = muc[j].second = 0; //am fol muc j;
        }while(next==0);
        nod = next;
    }
}
void dfs(int nod){
    int i, next;
    for(i=0; i<lista[nod].size(); i++){
        next = muc[lista[nod][i]].first;
        if(nod==next) next = muc[lista[nod][i]].second;
        if(tata[next]==0)
        {
            tata[next]=nod;
            arb[lista[nod][i]]=true;
            dfs(next);
        }
    }
}