Pagini recente » Cod sursa (job #1705945) | Cod sursa (job #740079) | Cod sursa (job #2008977) | Cod sursa (job #200941) | Cod sursa (job #1581925)
#include <fstream>
#include <bitset>
#include <vector>
#include <stack>
using namespace std;
vector < pair<int, int> > L[100010];
stack<int> st;
bitset<100010> b;
bitset<500010> f;
int D[100010];
int n, m, i, nod, vecin, x, y, s;
void dfs(int nod) {
b[nod] = 1;
for (vector< pair<int, int> >::iterator it = L[nod].begin(); it != L[nod].end(); it++) {
if ( b[ it->first ] == 0)
dfs(it->first);
}
}
int main () {
ifstream fin ("ciclueuler.in");
ofstream fout("ciclueuler.out");
fin>>n>>m;
for (i=1;i<=m;i++) {
fin>>x>>y;
L[x].push_back( make_pair(y, i) );
L[y].push_back( make_pair(x, i) );
D[x] ++;
D[y] ++;
}
for (i=1;i<=n;i++)
if (D[i] != 0) {
s = i;
dfs(i);
break;
}
for (i=1;i<=n;i++)
if (D[i] % 2 == 1 || ( D[i]!=0 && b[i] == 0 )) {
fout<<-1;
return 0;
}
int first = 1; // prima tiparire
st.push(s);
while (!st.empty()) {
nod = st.top();
if (D[nod] == 0) {
if (!first)
fout<<nod<<" ";
first = 0;
st.pop();
continue;
}
while ( f[L[nod].back() . second] == 1 )
L[nod].pop_back();
int vecin = L[nod].back() . first;
D[vecin] --;
D[nod] --;
f[L[nod].back() . second] = 1;
L[nod].pop_back();
st.push(vecin);
}
return 0;
}