Cod sursa(job #1226121)

Utilizator mihail.jianuJianu Mihail mihail.jianu Data 4 septembrie 2014 16:50:49
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
using namespace std;
const int N=100000;
vector<int>g[N+1];
queue<int>q;
stack<int>st;
int degree[N+1];
bool vis[N+1],f=true;
FILE*in,*out;
void bfs(int node){
    q.push(node);
    vis[1]=true;
    while(!q.empty()){
        int dad=q.front();
        for(int i=0;i<g[dad].size();i++){
            int son=g[dad][i];
            if(!vis[son]){
                vis[son]=true;
                q.push(son);
            }
        }
        q.pop();
    }
}
void eulerCycle(int node){
    for(int i=0;i<g[node].size();i++){
        int son=g[node][i];
        g[node].erase(g[node].begin()+i);
        for(int j=0;j<g[son].size();j++)
            if(g[son][j]==node){
                g[son].erase(g[son].begin()+j);
                break;
            }
        eulerCycle(son);
    }
    if(f)
        f=false;
    else
        fprintf(out,"%d ",node);
}
int main(){
    int i,n,m;
    in=fopen("ciclueuler.in","r");
    out=fopen("ciclueuler.out","w");
    fscanf(in,"%d%d",&n,&m);
    for(i=1;i<=m;i++){
        int v1,v2;
        fscanf(in,"%d%d",&v1,&v2);
        g[v1].push_back(v2);
        g[v2].push_back(v1);
        degree[v1]++;
        degree[v2]++;
    }
    bfs(1);
    for(i=1;i<=n;i++)
        if(degree[i]%2==1||vis[i]==false){
            fprintf(out,"-1");
            return 0;
        }
    eulerCycle(1);
    return 0;
}