Pagini recente » Cod sursa (job #2770939) | Cod sursa (job #1581987) | Cod sursa (job #115651) | Cod sursa (job #690451) | Cod sursa (job #1322267)
#include<stdio.h>
#include<vector>
#include<stack>
using namespace std;
#define MAXSIZE 100002
#define FIN "ciclueuler.in"
#define FOUT "ciclueuler.out"
int n,m;
vector<int> g[MAXSIZE];
vector<int> chain;
stack<int> myStack;
bool visited[MAXSIZE];
int grade[MAXSIZE];
int read()
{
scanf("%d %d",&n,&m);
int x,y;
for(int i=1;i<=m;i++)
{
scanf("%d %d", &x,&y);
g[x].push_back(y);
g[y].push_back(x);
}
}
int euler(int node)
{
while(!myStack.empty() || g[node].size() > 0)
{
if(g[node].size() > 0)
{
myStack.push(node);
int v = g[node].front();
g[node].erase(g[node].begin());
for(vector<int>::iterator it = g[v].begin(); it!= g[v].end(); it++)
{
if(*it == node)
{
g[v].erase(it);
break;
}
}
node = v;
}
else
{
chain.push_back(node);
node = myStack.top();
myStack.pop();
}
}
}
int dfs(int node)
{
visited[node] = true;
int length = g[node].size();
for(int i = 0; i < length; i++)
{
if(!visited[g[node][i]])
{
grade[g[node][i]]++;
dfs(g[node][i]);
}
}
}
bool isConnected()
{
dfs(1);
for(int i=1;i<=n;i++)
{
if(visited[i] == false)
{
return false;
}
}
return true;
}
bool matchGrade()
{
for(int i=1; i<=n;i++)
if(g[i].size() % 2 != 0)
return false;
return true;
}
int write()
{
for(int i=0;i<m;i++)
{
printf("%d ",chain[i]);
}
}
int main()
{
freopen(FIN,"r",stdin);
freopen(FOUT,"w",stdout);
read();
if(isConnected() && matchGrade())
{
euler(1);
write();
}
else printf("-1");
return 0;
}