Pagini recente » Cod sursa (job #1422406) | Cod sursa (job #2920093) | Cod sursa (job #1358679) | Cod sursa (job #2766308) | Cod sursa (job #926294)
Cod sursa(job #926294)
#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;
}