Nu aveti permisiuni pentru a descarca fisierul grader_test20.ok
Cod sursa(job #923049)
Utilizator | Data | 22 martie 2013 20:18:59 | |
---|---|---|---|
Problema | Ciclu Eulerian | Scor | 80 |
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[100000];
stack <int >sol;
int viz[100000];
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;
}