Cod sursa(job #923054)

Utilizator krissu93FMI Tiugan Cristiana Elena krissu93 Data 22 martie 2013 20:22:15
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
using namespace std;

ofstream out("ciclueuler.out");
vector<int> vecini[100010];
stack <int >sol;
int viz[100010];


/*void parc_ad(int nod,int k){
viz[nod]=k;

for (int contor=0;contor<vecini[nod].size();contor++)
    if (viz[vecini[nod][contor]]==0)
        parc_ad(vecini[nod][contor],k);
}

bool conex(int noduri){
int k=0;

for (int contor=0;contor<noduri;contor++)
    if (viz[contor]==0 && vecini[contor].size()>0){
        k++;
        parc_ad(contor,k);}

if (k>1) return false;
    else return true;
}
*/
bool check(int noduri){
//verific daca graful este eulerian, adica daca este conex si are toate gradele pare

//if (conex(noduri)==false) return false;
for (int i=1;i<=noduri;i++)
    if (vecini[i].size()%2!=0)
        return false;
return true;
}

void get_data(int&noduri,int&muchii){
ifstream in("ciclueuler.in");
in>>noduri>>muchii;

for (int contor=0;contor<muchii;contor++){
    int nod1,nod2;
    in>>nod1>>nod2;
    vecini[nod1].push_back(nod2);
    vecini[nod2].push_back(nod1);
}
in.close();
}

void euler(int nod){
while (!vecini[nod].empty()){

    int ales=vecini[nod].back();
    sol.push(nod);
    vecini[nod].pop_back();
    for (int contor=0;contor<vecini[ales].size();contor++)
        if (vecini[ales][contor]==nod){
            vecini[ales][contor]=vecini[ales].back();
            vecini[ales].pop_back();
            break;}
    nod=ales;
}
}
void solve(int noduri, int muchii){
int nr=0;

sol.push(1);

do {
    int ales=sol.top();
    sol.pop();
    nr++;
    euler(ales);
    if (nr<=muchii)
        out<<ales<<' ';

}
while (!sol.empty());
}


int main(){

int noduri,muchii;
get_data(noduri,muchii);

if (check(noduri)==false) out<<-1;
else solve(noduri,muchii);

out.close();
return 0;
}