Pagini recente » Cod sursa (job #520413) | Cod sursa (job #2555329) | Cod sursa (job #1059875) | Cod sursa (job #2588639) | Cod sursa (job #934601)
Cod sursa(job #934601)
#include <cstdio>
#include <cstring>
#include <cassert>
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <string>
#include <queue>
#include <stack>
#define e first
#define v second
using namespace std;
typedef long long int64;
typedef vector< pair<int, int> >::iterator it;
const int oo = 0x3f3f3f3f;
const int MAX_V = 100005;
const int MAX_E = 500005;
vector< pair<int, int> > G[MAX_V];
int V, E, Degree[MAX_V];
bool Used[MAX_E], Solution;
inline int GetDegree(int X) {
for (; Degree[X] > 0 && Used[G[X][Degree[X] - 1].e]; --Degree[X]);
return Degree[X];
}
void Euler(int X, stack< pair<int, int> >& Stack) {
for (int Y; GetDegree(X) > 0; X = Y) {
Y = G[X][GetDegree(X) - 1].v;
Stack.push(make_pair(G[X][GetDegree(X) - 1].e, X));
Used[G[X][GetDegree(X) - 1].e] = true;
}
}
vector< pair<int, int> > EulerianCycle(int Start) {
stack< pair<int, int> > Stack;
vector< pair<int, int> > Cycle;
int X = Start;
do {
Euler(X, Stack);
X = Stack.top().v;
Cycle.push_back(Stack.top());
Stack.pop();
} while (!Stack.empty());
reverse(Cycle.begin(), Cycle.end());
return Cycle;
}
bool EulerianGraph() {
for (int X = 1; X <= V; ++X)
if (Degree[X] % 2 != 0)
return false;
return true;
}
void Read() {
ifstream in("ciclueuler.in");
in >> V >> E;
for (int i = 0; i < E; ++i) {
int X, Y; in >> X >> Y;
++Degree[X]; ++Degree[Y];
G[X].push_back(make_pair(i, Y)); G[Y].push_back(make_pair(i, X));
}
in.close();
}
void Print(vector< pair<int, int> >& Cycle) {
ofstream out("ciclueuler.out");
if (!Solution) {
out << "-1\n";
} else {
for (size_t i = 0; i < Cycle.size(); ++i)
out << Cycle[i].v << " ";
out << "\n";
}
out.close();
}
int main() {
Read();
vector< pair<int, int> > Cycle;
Solution = false;
if (EulerianGraph()) {
Solution = true;
Cycle = EulerianCycle(1);
}
for (int i = 0; i < E; ++i)
if (!Used[i])
Solution = false;
Print(Cycle);
return 0;
}