Cod sursa(job #1818286)

Utilizator andreicoman299Coman Andrei andreicoman299 Data 28 noiembrie 2016 23:23:30
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.27 kb
#include <stdio.h>
#include <stdlib.h>
#include <vector>

#define BUF_SIZE 1<<17
char buf[BUF_SIZE];
int pbuf=BUF_SIZE;
FILE*fi,*fo;
inline char nextch(){
    if(pbuf==BUF_SIZE){
        fread(buf, BUF_SIZE, 1, fi);
        pbuf=0;
    }
    return buf[pbuf++];
}
inline long long nextnum(){
    long long a=0;
    char c=nextch();
    while((c<'0' || c>'9') && c!='-')
        c=nextch();
    int semn=1;
    if(c=='-'){
        semn=-1;
        c=nextch();
    }
    while('0'<=c && c<='9'){
        a=a*10+c-'0';
        c=nextch();
    }
    return a*semn;
}

#define MAXN 100000
#define MAXM 500000

struct Edge{
    int a, b;
    int valid;
} M[1+MAXM];
std::vector <int> G[1+MAXN];
int gr[1+MAXN];
int stiva[1+MAXM], last[1+MAXN];

void ciclu(int node){
    for(int i=0;i<G[node].size();i++)
        if(M[G[node][i]].valid){
            M[G[node][i]].valid=0;
            if(M[G[node][i]].a==node)
                ciclu(M[G[node][i]].b);
            else
                ciclu(M[G[node][i]].a);
        }
    fprintf(fo,"%d ", node);
}

int main(){
    fi=fopen("ciclueuler.in","r");
    fo=fopen("ciclueuler.out","w");
    int n=nextnum(), m=nextnum();
    for(int i=1;i<=m;i++){
        M[i].a=nextnum();
        M[i].b=nextnum();
        M[i].valid=1;
        gr[M[i].a]++;
        gr[M[i].b]++;
        G[M[i].a].push_back(i);
        G[M[i].b].push_back(i);
    }
    int eulerian=1;
    for(int i=1;i<=n;i++)
        if(gr[i]%2==1)
            eulerian=0;
    if(!eulerian)
        fprintf(fo,"-1");
    else{
        stiva[1]=1;
        int u=1;
        while(u>0){
            while(last[stiva[u]]<G[stiva[u]].size() && M[G[stiva[u]][last[stiva[u]]]].valid==0)
                last[stiva[u]]++;
            if(last[stiva[u]]==G[stiva[u]].size()){
                fprintf(fo,"%d ", stiva[u]);
                u--;
            }
            else{
                M[G[stiva[u]][last[stiva[u]]]].valid=0;
                if(M[G[stiva[u]][last[stiva[u]]]].a==stiva[u])
                    stiva[u+1]=M[G[stiva[u]][last[stiva[u]]]].b;
                else
                    stiva[u+1]=M[G[stiva[u]][last[stiva[u]]]].a;
                u++;
            }
        }
    }
    fclose(fi);
    fclose(fo);
    return 0;
}