Cod sursa(job #2172790)

Utilizator PinkiePie1189Preoteasa Mircea-Costin PinkiePie1189 Data 15 martie 2018 17:53:38
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include<stdio.h>
#include<utility>
#include<vector>
#define MAXV 100000
#define MAXE 500000
struct Edge
{
    int src;
    int dst;
};
void euler(int nod);
FILE*fin,*fout;
int st[MAXE+1];
int ult=-1;
std::vector<int> neighbors[MAXV+1];
std::vector<int> sol;
Edge edges[MAXE+1];
bool viz[MAXE+1];
int nr_edges[MAXV+1];
int V,E;
int main()
{
    fin=fopen("ciclueuler.in","r");
    fout=fopen("ciclueuler.out","w");
    fscanf(fin,"%d%d",&V,&E);
    for(int i=1; i<=E; i++)
    {
        int src,dst;
        fscanf(fin,"%d%d",&src,&dst);
        neighbors[src].push_back(i);
        neighbors[dst].push_back(i);
        edges[i].src=src;
        edges[i].dst=dst;
        nr_edges[src]++;
        nr_edges[dst]++;
    }
    bool ok=1;
    for(int i=1; i<=V && ok; i++)
    {
        if(nr_edges[i]%2==1)
        {
            ok=0;
        }
    }
    if(ok)
    {
        euler(1);
        for(int i=0;i<sol.size()-1;i++)
        {
            fprintf(fout,"%d ",sol[i]);
        }
    }
    else
    {
        fprintf(fout,"-1");
    }
    fclose(fin);
    fclose(fout);
    return 0;
}
void euler(int nod)
{
    st[++ult]=nod;
    while(ult>=0)
    {
        nod=st[ult];
        if(!neighbors[nod].empty())
        {
            //printf("aici %d",nod);
            int muchie=neighbors[nod].back();
            neighbors[nod].pop_back();
            if(!viz[muchie])
            {
                viz[muchie]=1;
                int to;
                if(nod==edges[muchie].src)
                {
                    to=edges[muchie].dst;
                }
                else
                {
                    to=edges[muchie].src;
                }
                st[++ult]=to;
            }
        }
        else
        {
            ult--;
            sol.push_back(nod);
        }
    }
}