Cod sursa(job #1226047)

Utilizator mihail.jianuJianu Mihail mihail.jianu Data 4 septembrie 2014 14:24:44
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 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];
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){
    bool f=true;
    st.push(node);
    while(!st.empty()){
        int dad=st.top();
        st.pop();
        if(f)
            f=false;
        else
            fprintf(out,"%d ",dad);
        int noDel=0;
        for(int i=0;i<g[dad].size();i++){
            int son=g[dad][i];
            g[dad].erase(g[dad].begin()+i-noDel);
            noDel++;
            for(int j=0;j<g[son].size();j++)
                if(g[son][j]==dad){
                    g[son].erase(g[son].begin()+j);
                    break;
                }
            st.push(son);
        }
    }
}
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;
}