Pagini recente » Cod sursa (job #16965) | Cod sursa (job #1340721) | Cod sursa (job #1001638) | Cod sursa (job #1163745) | Cod sursa (job #607938)
Cod sursa(job #607938)
#include <cstdio>
#include <map>
#include <stack>
#include <vector>
#define INFILE "ciclueuler.in"
#define OUTFILE "ciclueuler.out"
#define NMax 100001
using namespace std;
int N, M, A;
map<int, int> E[NMax];
stack<int> S;
bool viz[NMax];
int counter[NMax];
vector<int> stuff;
void check(int k)
{
map<int, int>::iterator f;
viz[k] = true;
for (f = E[k].begin(); f != E[k].end(); ++f)
if (!viz[f->first])
check(f->first);
}
int main()
{
int x, y;
map<int, int>::iterator f;
freopen(INFILE, "r", stdin);
freopen(OUTFILE, "w", stdout);
scanf("%d%d", &N, &M);
// citesc muchiile
while (M--)
{
scanf("%d%d", &x, &y);
if (x == y)
{
counter[x]++;
continue;
}
// adaug la x
f = E[x].find(y);
if (f == E[x].end())
E[x].insert(make_pair(y, 1));
else
f->second++;
// adaug la y
f = E[y].find(x);
if (f == E[y].end())
E[y].insert(make_pair(x, 1));
else
f->second++;
}
for (int i = 1; i <= N; ++i)
{
for (y = 0, f = E[i].begin(); f != E[i].end(); ++f)
if (f->first != i)
y += f->second;
if (y % 2)
{
printf("-1\n");
return 0;
}
}
check(1);
for (int i = 1; i <= N; ++i)
if (!viz[i])
{
printf("-1\n");
return 0;
}
// adaug primul nod
S.push(1);
// simulez recursia
while (!S.empty())
{
// preiau nodul curent
x = S.top();
// are fii?
if (E[x].size() > 0)
{
f = E[x].begin();
y = f->first;
// adaug fiul lui
S.push(y);
// distrug legatura dinspre x
if (f->second == 1)
E[x].erase(y);
else
f->second--;
// distrug legatura dinspre y
f = E[y].find(x);
if (f->second == 1)
E[y].erase(x);
else
f->second--;
}
else
{
// scriu buclele
for (int i = 1; i <= counter[x]; ++i)
stuff.push_back(x);
// scriu nodul
stuff.push_back(x);
counter[x] = 0;
// elimin nodul curent
S.pop();
}
}
//scriu solutia
stuff.pop_back();
for (int i = 0; i < stuff.size(); ++i)
printf("%d ", stuff[i]);
printf("\n");
return 0;
}