Pagini recente » Cod sursa (job #3303852) | Cod sursa (job #265046) | Cod sursa (job #206675) | Monitorul de evaluare | Cod sursa (job #3303848)
#include <bits/stdc++.h>
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
const int nmax=500005;
vector < multiset<int> > gr(nmax);
vector <int> euler;
int viz[nmax],x,y,n,m;
void dfs(int nod)
{
viz[nod]=true;
for (int vec:gr[nod] )
if ( !viz[vec] )
dfs(vec);
}
bool is_eulerian(int n)
{
for (int i=1; i<=n; i++ )
if ( gr[i].size()%2!=0 )
return false;
int start=1;
while ( gr[start].empty() && start<=n )
start++;
dfs(start);
for (int i=1; i<=n; i++ )
if ( !gr[i].empty() && !viz[i] )
return false;
return true;
}
void euler_cycle(int start)
{
stack <int> st;
st.push(start);
while ( !st.empty() )
{
int nod=st.top();
if ( !gr[nod].empty() )
{
int next=*gr[nod].begin();
gr[nod].erase(gr[nod].find(next));
gr[next].erase(gr[next].find(nod));
st.push(next);
}
else
{
euler.push_back(nod);
st.pop();
}
}
}
int main()
{
f >> n >> m;
for (int i=1; i<=m; i++ )
{
f >> x >> y;
gr[x].insert(y);
gr[y].insert(x);
}
if ( is_eulerian(n) )
{
int start=1;
while ( gr[start].empty() && start<=n )
start++;
euler_cycle(start);
for (int i=0; i<euler.size(); i++ )
g << euler[i] << " ";
}
return 0;
}