Cod sursa(job #2016515)

Utilizator cipri321Marin Ciprian cipri321 Data 29 august 2017 16:06:26
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include <cstdio>
#include <set>
#include <stack>
#include <vector>
#define DIM 100001
using namespace std;
FILE *fi,*fo;
int n,m;
vector<int> V[DIM],REZ;
pair<int,int> M[5*DIM];
bool VIZ[5*DIM],ok=true;
stack<int> S;
char buff[DIM];
int poz=0;
void citeste(int &numar)
{
     numar = 0;
     //cat timp caracterul din buffer nu e cifra ignor
     while (buff[poz] < '0' || buff[poz] > '9')
          //daca am "golit" bufferul atunci il umplu
          if (++poz == DIM)
               fread(buff,1,DIM,fi),poz=0;
     //cat timp dau de o cifra recalculez numarul
     while ('0'<=buff[poz] && buff[poz]<='9')
     {
          numar = numar*10 + buff[poz] - '0';
          if (++poz == DIM)
               fread(buff,1,DIM,fi),poz=0;
     }
}
int main()
{
    fi=fopen("ciclueuler.in","r");
    fo=fopen("ciclueuler.out","w");
    citeste(n);
    citeste(m);
    for(int i=1;i<=m;i++)
    {
        int a,b;
        citeste(a);
        citeste(b);
        V[a].push_back(i);
        V[b].push_back(i);
        M[i]=make_pair(a,b);
    }
    for(int i=1;i<=n;i++)
        if(V[i].size()==0 || V[i].size()%2==1)
            ok=false;
    if(!ok)
        fprintf(fo,"-1");
    else
    {
        S.push(1);
        while(!S.empty())
        {
            int v=S.top();
            if(V[v].empty())
            {
                S.pop();
                fprintf(fo,"%d ",v);
            }
            else
            {
                    int e=V[v].back();
                    int to=M[e].first;
                    if(to==v && M[e].first!=M[e].second)
                        to=M[e].second;
                    V[v].pop_back();
                    if(!VIZ[e])
                    {
                        S.push(to);
                        VIZ[e]=true;
                    }
            }
        }
    }
    fclose(fi);
    fclose(fo);
    return 0;
}