Cod sursa(job #1731836)

Utilizator RRomaniucRomaniuc Radu Andrei RRomaniuc Data 20 iulie 2016 01:11:05
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.68 kb
#include <stdio.h>
#include <queue>
#include <list>
#include <stack>
#include <string.h>
#define MAXN 100001
int numarNoduri, copieNumarNoduri, numarMuchii, nodCurent, gradNod[MAXN] = {0}, i, vecin, nodx, nody;
FILE *inputFile = fopen("ciclueuler.in", "r"), *outputFile = fopen("ciclueuler.out", "w");
std::queue<int> coada;
std::list<int> vecini[MAXN], cicluEuler;
std::stack<int> stiva;
bool vizitat[MAXN];
void BFS(int nodPlecare)
{
    memset(vizitat, 0, sizeof(bool)*MAXN);
    
    copieNumarNoduri = numarNoduri;
    coada.push(nodPlecare);
    
    while(!coada.empty())
    {
        nodCurent = coada.front(); coada.pop();
        for(std::list<int>::iterator it = vecini[nodCurent].begin(); it != vecini[nodCurent].end(); it++)
        {
            vecin = *it;
            if(vizitat[vecin] == false)
            {
                vizitat[vecin] = true;
                coada.push(vecin);
                
                copieNumarNoduri--;
            }
        }
    }
}
void parcurgereEuler(int nodPlecare)
{
    while(!vecini[nodPlecare].empty())
    {
        vecin = vecini[nodPlecare].front(); vecini[nodPlecare].pop_front();
        
        for(std::list<int>::iterator it = vecini[vecin].begin(); it != vecini[vecin].end(); it++)
            if( *it == nodPlecare)
            {
                vecini[vecin].erase(it);
                break;
            }
        
        stiva.push(nodPlecare);
        nodPlecare = vecin;
    }
}
int main()
{
    fscanf(inputFile, "%d %d", &numarNoduri, &numarMuchii);
    
    for(i = 1; i <= numarMuchii; i++)
    {
        fscanf(inputFile, "%d %d", &nodx, &nody);
        if(nodx != nody)
        {
            vecini[nodx].push_back(nody);
            vecini[nody].push_back(nodx);
            
            gradNod[nodx]++;
            gradNod[nody]++;
        }
        else
        {
            vecini[nodx].push_back(nodx);
            gradNod[nodx] +=2;
        }
    }
    
    for(std::list<int>::iterator it = vecini[3].begin(); it != vecini[3].end(); it++)
        fprintf(outputFile, "%d ", *it);
    
    fprintf(outputFile, "\n");
    
    BFS(1);
    
    if(copieNumarNoduri > 0)
    {
        fprintf(outputFile, "-1");
        return 0;
    }
    
    for(int nod = 0; nod < numarNoduri; nod++)
        if(gradNod[nod] % 2 != 0)
        {
            fprintf(outputFile, "-1");
            return 0;
        }
    
    int nod = 1;
    
    do {
        
        parcurgereEuler(nod);
        nod = stiva.top(); stiva.pop();
        
        cicluEuler.push_back(nod);
        
    } while(!stiva.empty());
    
    
    for(std::list<int>::iterator it = cicluEuler.begin(); it != cicluEuler.end(); it++)
        fprintf(outputFile, "%d ", *it);
    
    return 0;
}