Cod sursa(job #2477432)

Utilizator anamariatoaderAna Toader anamariatoader Data 20 octombrie 2019 12:48:32
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <fstream>
#include <vector>

using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");

int n,m,i,j,x,y,gr[100005],ciclu[500005],start[100005],p,euler[500005];
bool viz[500005];
struct arc{
    int nod,m;
};
vector <arc> g[500005];

int main(){
    fin>>n>>m;
    for(i=1;i<=m;i++){
        fin>>x>>y;
        gr[x]++;
        gr[y]++;
        g[x].push_back({y,i});
        g[y].push_back({x,i});
    }
    for(i=1;i<=n;i++){
        if(gr[i]%2){
            fout<<-1;
            return 0;
        }
        if(gr[i]>0 && !ciclu[1])
            ciclu[1]=i;
    }
    int k=1;
    while(k>0){
        if(gr[ciclu[k]]==0){
            euler[++p]=ciclu[k];
            k--;
            continue;
        }
        for(;start[ciclu[k]]<g[ciclu[k]].size();start[ciclu[k]]++){
            int nod = g[ciclu[k]][start[ciclu[k]]].nod;
            int arc = g[ciclu[k]][start[ciclu[k]]].m;
            if(viz[arc]==0){
                gr[nod]--;
                gr[ciclu[k]]--;
                viz[arc]=1;
                ciclu[++k]=nod;
                break;
            }
        }
    }
    if(p-1!=m){
        fout<<-1;
        return 0;
    }
    for(i=1;i<p;i++)
        fout<<euler[i]<<' ';
    return 0;
}