Cod sursa(job #1916327)

Utilizator Manolache_MihaiManolache Mihai Manolache_Mihai Data 9 martie 2017 09:02:24
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <fstream>
#include <vector>
#include <cstdlib>
#define NMAX 100005

using namespace std;

const char inname[] = "ciclueuler.in";
const char outname[] = "ciclueuler.out";
ifstream fin(inname);
ofstream fout(outname);

struct liste{
    vector<int> vecini;
    vector<int> folosit;
};
liste L[NMAX];

void citire();
void ceuler(int);

int i, ct, ordine[NMAX], viz[NMAX], n, m;

int main(){
    citire();
    ct = 1;
    ceuler(1);
    fout << "-1\n";
    fin.close();
    fout.close();
    return 0;
}


void citire(){
    int i, x, y;
    fin >> n >> m;
    for(i=1; i<=m; i++){
        fin >> x >> y;
        if(x == y){
            L[x].vecini.push_back(x);
            L[x].folosit.push_back(0);
            }
            else{
                L[x].vecini.push_back(y);
                L[y].vecini.push_back(x);
                L[x].folosit.push_back(0);
                L[y].folosit.push_back(0);
                }
        }
}

void ceuler(int x){
    int i, j;
    ordine[ct] = x;
    viz[x]++;
    ct++;
    if(ct == m+1){
        for(i=1; i<=m; i++)
            fout << ordine[i] << ' ';
        fout << '\n';
        fin.close();
        fout.close();
        exit(0);
        }
    for(i=0; i<L[x].vecini.size(); i++){
        if(L[x].folosit[i] == 0){
            L[x].folosit[i] = 1;
            for(j=0; j<L[L[x].vecini[i]].vecini.size(); j++)
                if(L[L[x].vecini[i]].vecini[j] == x){
                    L[L[x].vecini[i]].folosit[j] = 1;
                    break;
                    }
            ceuler(L[x].vecini[i]);
            ct--;
            }
        }
}