Pagini recente » Cod sursa (job #1414714) | Borderou de evaluare (job #2488045) | Cod sursa (job #352671) | Cod sursa (job #1298376) | Cod sursa (job #1638467)
#include <fstream>
#include <vector>
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
vector<pair<int, int> > L[100005];
vector<pair<int, int> > mm;
vector<int> ans;
bool vm[500005];
bool viz[3][100005];
int w, n;
void df_deconex(int v) {
viz[w][v] = true;
for(int i = 0; i < L[v].size(); i ++) {
int act = L[v][i].first;
int muc = L[v][i].second;
if(!viz[w][act] && !vm[muc])
df_deconex(act);
}
}
bool would_deconex(int muc) {
int x = mm[muc].first;
int y = mm[muc].second;
bool ok = true;
vm[muc] = true;
w = 1; df_deconex(x);
w = 2; df_deconex(y);
int k1 = 0, k2 = 0;
for(int i = 2; i <= n; i ++)
if(viz[1][i]) k1 ++;
for(int i = 1; i <= n; i ++)
if(viz[2][i]) k2 ++;
if(k1 != 1 && k2 != 1) {
for(int i = 1; i <= n; i ++) {
if(viz[1][i] != viz[2][i]) {
ok = false;
break;
}
}
}
for(int i = 1; i <= n; i ++) viz[1][i] = viz[2][i] = false;
vm[muc] = false;
return ok;
}
void df(int v) {
ans.push_back(v);
for(int i = 0; i < L[v].size(); i ++) {
int act = L[v][i].first;
int muc = L[v][i].second;
if(!vm[muc] && would_deconex(muc)) {
vm[muc] = true;
df(act);
return ;
}
}
}
int main()
{
int m, x, y; f >> n >> m;
for(int i = 1; i <= m; i ++) {
f >> x >> y; // MULTIGRAF!!!!!!!!!!!!!!!
L[x].push_back({y, i - 1});
L[y].push_back({x, i - 1});
mm.push_back({x, y});
}
w = 1; df_deconex(1);
int i;
for(i = 1; i <= n; i ++) if(!viz[1][i] || (L[i].size() & 1)) i = n + 2;
if(i == n + 3) {
g << "-1\n";
return 0;
}
df(1);
for(int i = 0; i < ans.size(); i ++) g << ans[i] << " ";
g << "\n";
return 0;
}