Pagini recente » Cod sursa (job #3245590) | Cod sursa (job #642715) | Cod sursa (job #2186335) | Cod sursa (job #2176705) | Cod sursa (job #2820165)
#include <bits/stdc++.h>
#define NMAX 100005
//http://www.graph-magics.com/articles/euler.php
//avand in vedere ca graful este neorientat nu vom putea sterge usor o muchie din listele de adiacenta a celor 2 noduri pe care le leaga,
// deci lista de adiacenta va tine minte pt fiecare nod atat celalat nodul vecin cat si index ul muchiei ce leaga nodurile
using namespace std;
int n,m;
vector< vector < pair<int,int> > > adj(NMAX);
void EulerRead(){
ifstream fin("ciclueuler.in");
fin>>n>>m;
adj.resize(n + 1);
for(int i = 0; i < m; i++)
{
int x, y;
fin>>x>>y;
adj[x].push_back(make_pair(y,i)); // muchia cu index i leaga nodul x de nodul y
adj[y].push_back(make_pair(x,i)); // aceeasi muchie leaga totodata si y de x
}
fin.close();
}
void Euler(){
ofstream fout("ciclueuler.out");
for(int i = 1; i <= n; i++)
{
if(adj[i].size() % 2 != 0)
{
fout<<"-1";
fout.close();
exit(0);
}
}
vector<bool> usedEdge(m+1,0); //vector ce minte daca o muchie a fost utilizata in ciclu
vector<int> result;
stack<int> curr_node;
curr_node.push(1);
while(!curr_node.empty())
{
int node = curr_node.top();
if(!adj[node].empty())
{
//int next_node = (adj[curr_node].back()).first();
pair<int,int> next_node = adj[node].back();
adj[node].pop_back();
if(!usedEdge[next_node.second])
{
usedEdge[next_node.second] = true;
curr_node.push(next_node.first);
}
}else{
result.push_back(node);
curr_node.pop();
}
}
for(int i = 0; i < result.size(); i++)
fout<< result[i]<< " ";
fout.close();
}
int main(){
EulerRead();
Euler();
return 0;
}