Pagini recente » Cod sursa (job #1084816) | Cod sursa (job #3139995) | Cod sursa (job #2591895) | Cod sursa (job #2629155) | Cod sursa (job #1976633)
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
using namespace std;
ifstream in("ciclueuler.in"); //n (100000) m (200000), m perechi muchiile
ofstream out("ciclueuler.out");
int const nmax = 1000000;
//1 -> (1, 2), (1, 3), (1, 4)
struct Edge{
int x;
int y;
bool del;
};
vector <Edge> edge;
vector <vector<int>> v; //v[i] = muchiile care pleaca din nodul i
int frec[1 + nmax];
int cc[1 + nmax]; //cc[i] = componenta conexa caruia nodul i apartine
//pentru determinarea conexitatii grafului
void dfs(int nod) {
cc[nod] = 1;
for(int i = 0 ; i < v[nod].size(); i++) {
int x = edge[v[nod][i]].x;
int y = edge[v[nod][i]].y;
/*
if(x == nod && cc[y] == 0)
dfs(y);
else if(y == nod && cc[x] == 0)
dfs(x);
*/
if(cc[y] == 0)
dfs(y);
else if(cc[x] == 0)
dfs(x);
}
}
stack<int> st;
///iterativ
void dfs2(int nod){
cc[nod] = 1;
st.push(nod);
while(0 < st.size()){
for(int k = 0; k < v [st.top()].size(); k++) {
int i = v[st.top()][k];
int x = edge[i].x;
int y = edge[i].y;
if(cc[y] == 0){
st.push(y);
cc[y] = 1;
}else if(cc[x] == 0){
st.push(x);
cc[x] = 1;
}
}
st.pop();
}
}
//varianta iterativa a buildercircuit
void buildeulercircuit2(int nod) {
st.push(nod);
while(0 < st.size()) {
if(0 < v[st.top()].size()) {
int e = v[st.top()].back();
//atentie cand folosesti back, sau top sau orice altceva care interogheaza o structura de date
//verifica de o mie de ori ca structura de date nu e goala
v[st.top()].pop_back();
if(edge[e].del == 0) {
edge[e].del = 1;
int x = edge[e].x;
int y = edge[e].y;
if(x == st.top()) {
st.push(y);
} else{
st.push(x);
}
}
} else{
out<<st.top()<<" ";
st.pop();
}
}
}
void buildeulercircuit(int nod) {
while(0 < v[nod].size()) {
int e = v[nod].back(); //v[nod][v[nod].size() - 1];
v[nod].pop_back();
if(edge[e].del == 0) {
edge[e].del = 1;
int x = edge[e].x;
int y = edge[e].y;
if(x == nod) {
buildeulercircuit(y);
} else{
buildeulercircuit(x);
}
}
}
out<<nod<<" ";
}
int main() {
int n ,m;
in>>n>>m;
for(int i = 0 ; i <= n ;i++){
vector <int> temp;
v.push_back(temp);
}
int neizo = 0;
for(int i = 0 ; i < m ;i++) {
int x ,y;
in>>x>>y;
edge.push_back({x ,y ,0});
v[x].push_back(i);
v[y].push_back(i);
frec[x]++;
frec[y]++;
neizo = x;
}
dfs2(neizo);
bool flag = 1;
int first = 0;
for(int i = 1 ; i <= n ;i++) {
//cout<<frec[i]<<" "<<cc[i]<<'\n';
if((frec[i] & 1) == 1)
flag = 0;
if(cc[i] == 0 && 0 < frec[i])
flag = 0;
}
if(flag == 1)
buildeulercircuit2(neizo);
else{
out<<"-1";
}
return 0;
}