Cod sursa(job #1322267)

Utilizator goalexboxerFMI Alexandru Ionascu goalexboxer Data 19 ianuarie 2015 21:59:56
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.02 kb
#include<stdio.h>
#include<vector>
#include<stack>
using namespace std;

#define MAXSIZE 100002
#define FIN "ciclueuler.in"
#define FOUT "ciclueuler.out"

int n,m;
vector<int> g[MAXSIZE];
vector<int> chain;
stack<int> myStack;

bool visited[MAXSIZE];
int grade[MAXSIZE];

int read()
{
    scanf("%d %d",&n,&m);
    int x,y;

    for(int i=1;i<=m;i++)
    {
        scanf("%d %d", &x,&y);
        g[x].push_back(y);
        g[y].push_back(x);
    }
}

int euler(int node)
{

    while(!myStack.empty() || g[node].size() > 0)
    {

        if(g[node].size() > 0)
        {
            myStack.push(node);
            int v = g[node].front();
            g[node].erase(g[node].begin());
            for(vector<int>::iterator it = g[v].begin(); it!= g[v].end(); it++)
            {
                if(*it == node)
                {
                    g[v].erase(it);
                    break;
                }

            }

            node = v;
        }
        else
        {
            chain.push_back(node);
            node = myStack.top();
            myStack.pop();
        }

    }

}

int dfs(int node)
{
    visited[node] = true;
    int length = g[node].size();
    for(int i = 0; i < length; i++)
    {
        if(!visited[g[node][i]])
        {
            grade[g[node][i]]++;
            dfs(g[node][i]);
        }

    }
}

bool isConnected()
{
    dfs(1);

    for(int i=1;i<=n;i++)
    {
        if(visited[i] == false)
        {
            return false;
        }

    }


    return true;
}

bool matchGrade()
{
    for(int i=1; i<=n;i++)
        if(g[i].size() % 2 != 0)
            return false;
    return true;
}


int write()
{
    for(int i=0;i<m;i++)
    {
        printf("%d ",chain[i]);
    }
}

int main()
{
    freopen(FIN,"r",stdin);
    freopen(FOUT,"w",stdout);
    read();

    if(isConnected() && matchGrade())
    {
        euler(1);
        write();
    }
    else printf("-1");


    return 0;
}