Cod sursa(job #1027491)

Utilizator kiralalaChitoraga Dumitru kiralala Data 12 noiembrie 2013 20:13:30
Problema Ciclu Eulerian Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.48 kb
#include<fstream>
#include<vector>
#include<cstring>
#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 isIntersection[NMAX];
int loops[NMAX];
int indSol;
int nrm;
int n,m;
int aux;

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

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

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

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,nrm+=1;
        else{
            if(isIntersection[x]==0)
            {
                graph[x].push_back(y);
                isIntersection[x]=1;
                isIntersection[y]=0;
            }
            else
            {
                graph[y].push_back(x);
                isIntersection[y]=1;
                isIntersection[x]=0;
            }

        }
    }

    memset(isIntersection,0,(sizeof(int)*(n+1)));

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

    GetSolution();
    nrm=0;
    WriteSolution(0);

    return 0;
}