Cod sursa(job #1370631)

Utilizator mihail.jianuJianu Mihail mihail.jianu Data 3 martie 2015 16:11:08
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.1 kb
#include<cstdio>
#include<vector>
#include<stack>
#include<cstring>
using namespace std;
const int N=100000;
class Node{
    public:
        int v;
        Node*next;
        Node*prec;
        Node*p;
        Node(){
            next=p=prec=NULL;
        }
};
Node g[N+1];
Node*last[N+1];
void add_edge(int x,int y){
    Node *node=last[x];
    node->next=new Node;
    last[x]=node->next;
    last[x]->prec=node;
    last[x]->v=y;
}
stack<int>st;
int grad[N+1];
int n,m;
bool f;
void euler(int node){
    st.push(node);
    while(!st.empty()){
        int dad=st.top();
        Node* son=g[dad].next;
        if(son==NULL){
            if(f)
                printf("%d ",dad);
            st.pop();
            f=true;
        }
        else{
            Node*node=son->p;
            if(node->next!=NULL)
                node->next->prec=node->prec;
            node->prec->next=node->next;
            if(son->next!=NULL)
                son->next->prec=son->prec;
            son->prec->next=son->next;
            st.push(son->v);
        }
    }
}
int main(){
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        last[i]=&g[i];
        g[i].v=i;
    }
    for(int i=1;i<=m;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        add_edge(x,y);
        add_edge(y,x);
        grad[x]++;
        grad[y]++;
        if(x!=y){
            Node*node=last[x];
            node->p=new Node;
            node->p=last[y];

            node=last[y];
            node->p=new Node;
            node->p=last[x];
        }
        else{
            Node*node=last[x];
            node->p=new Node;
            node->p=last[y]->prec;

            node=last[y]->prec;
            node->p=new Node;
            node->p=last[x];
        }
    }
    for(int i=1;i<=n;i++)
        if(grad[i]%2!=0){
            printf("-1");
            return 0;
        }
    for(int i=1;i<=n;i++)
        if(grad[i]!=0){
            euler(i);
            break;
        }
    return 0;
}