Cod sursa(job #1028187)

Utilizator kiralalaChitoraga Dumitru kiralala Data 13 noiembrie 2013 19:10:26
Problema Ciclu Eulerian Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.63 kb
#include<fstream>
#include<vector>
#include<algorithm>
#define NMAX 100005
//153319LU
using namespace std;

FILE* f=freopen("ciclueuler.in","r",stdin);
FILE* o=freopen("ciclueuler.out","w",stdout);

vector<int> graph[NMAX];
vector<vector<int> > solution;
int inter[NMAX];
int grdint[NMAX];
int grdext[NMAX];
int loops[NMAX];
int indSol;
int nrm;
int n,m;
int aux;

void GetSolution()
{
    int cNod=1;
    solution[0].push_back(1);
    int nextNode=1;
    int found;
    while(nextNode)
    {
        nextNode=0;
        found=1;
        while(found)
        {
            found=0;
            for(int i=0;i<graph[cNod].size();++i)
            {
                if(graph[cNod][i]!=-1)
                {
                    if(i+1<graph[cNod].size())
                        nextNode=cNod;
                    solution[indSol].push_back(graph[cNod][i]);
                    aux=cNod;
                    cNod=graph[cNod][i];
                    graph[aux][i]=-1;
                    found=1;
                    break;
                }
            }
        }

        if(nextNode)
        {
            solution.push_back(vector<int>());
            indSol+=1;
            inter[nextNode]=indSol;
            cNod=nextNode;
        }
    }
}

void WriteSolution(int k)
{
    for(int i=0;i<solution[k].size()&&nrm<m;++i)
    {
        printf("%d ",solution[k][i]);
        nrm+=1;
        while(loops[solution[k][i]]) {
            printf("%d ",solution[k][i]); loops[solution[k][i]]-=1, nrm+=1;
        }
        if(inter[solution[k][i]])
        {
            aux=inter[solution[k][i]];
            inter[solution[k][i]]=0;
            WriteSolution(aux);
        }
    }
}

int Try(int x,int y)
{
    int aux1=grdint[x]+1;
    int aux2=grdext[y]+1;

    if(abs(aux1-grdext[x])>1)
        return 0;
    if(abs(aux2-grdint[y])>1)
        return 0;
    return 1;
}

void TranslateArc(int x, int y)
{
    if(Try(x,y))
    {
        graph[x].push_back(y);
        grdint[x]+=1;
        grdext[y]+=1;
    }
    else
    {
        graph[y].push_back(x);
        grdint[y]+=1;
        grdext[x]+=1;
    }
}

int main()
{
    scanf("%d%d",&n,&m);

    for(int i=0;i<m;++i)
    {
        int x,y;
        scanf("%d%d",&x,&y);

        if(x==y) loops[x]+=1;
        else
        {
            TranslateArc(x,y);
        }
    }

    for(int i=1;i<=n;++i)
    {
        if(grdint[i]!=grdext[i]) {
            printf("%d",-1);
            return 0;
        }
    }

    solution.push_back(vector<int>());

    GetSolution();

    WriteSolution(0);

    return 0;
}