Pagini recente » Cod sursa (job #1106562) | Cod sursa (job #2825695) | Cod sursa (job #900037) | Cod sursa (job #3142996) | Cod sursa (job #2230310)
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
FILE *f,*g;
vector < int > v[100002];
int been[100002],deg[100002];
int n,m;
void read()
{
int x,y;
fscanf(f,"%d %d",&n,&m);
for(int i=1; i<=m; i++)
{
fscanf(f,"%d %d",&x,&y);
v[x].push_back(y);
v[y].push_back(x);
deg[x]++;
deg[y]++;
}
}
int dfs(int node, bool visited[])
{
visited[node]=true;
int nr=1;
for(int i=0; i<v[node].size(); i++)
if(!visited[v[node][i]] && v[node][i]!=-1)
nr+=dfs(v[node][i],visited);
return nr;
}
void remove_edge(int node, int node2)
{
for(int i=0; i<v[node].size(); i++)
if(v[node][i]==node2)
{
v[node][i]=-1;
break;
}
for(int i=0; i<v[node2].size(); i++)
if(v[node2][i]==node)
{
v[node2][i]=-1;
break;
}
}
void add_edge(int node, int node2)
{
for(int i=0; i<v[node].size(); i++)
if(v[node][i]==-1)
{
v[node][i]=node2;
break;
}
for(int i=0; i<v[node2].size(); i++)
if(v[node2][i]==-1)
{
v[node2][i]=node;
break;
}
}
int valid(int node, int node2)
{
int nr=0;
for(int i=0; i<v[node].size(); i++)
if(v[node][i]!=-1)
nr++;
if(nr==1)
return 1;
bool visited[n];
memset(visited, false, n+1);
int nr1=dfs(node, visited);
remove_edge(node, node2);
memset(visited, false, n+1);
int nr2=dfs(node, visited);
if(nr1>nr2)
return 0;
return 1;
}
void euler(int node)
{
int ok=1;
for(int i=0; i<v[node].size(); i++)
{
int node2=v[node][i];
if(node2!=-1)
{
if(valid(node,node2))
{
fprintf(g,"%d ",node2);
cout<<node2<<" ";
euler(node2);
}
else
add_edge(node,node2);
}
}
}
int main()
{
f=fopen("ciclueuler.in","r");
g=fopen("ciclueuler.out","w");
read();
for(int i=1; i<=n; i++)
if(deg[i]%2!=0)
{
fprintf(g,"-1");
return 0;
}
fprintf(g,"1 ");
euler(1);
fclose(f);
fclose(g);
return 0;
}