Pagini recente » Cod sursa (job #1458684) | Cod sursa (job #1560895) | Cod sursa (job #2692640) | Cod sursa (job #1594156) | Cod sursa (job #2228803)
#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]++;
if(x!=y)
deg[y]++;
}
}
int dfs(int node, bool visited[])
{
visited[node]=true;
int nr=1;
vector<int>::iterator i;
for(i=v[node].begin(); i!=v[node].end(); i++)
if(!visited[*i] && *i!=-1)
nr+=dfs(*i,visited);
return nr;
}
void remove_edge(int node, int node2)
{
vector<int>::iterator i;
for(i=v[node].begin(); i!=v[node].end(); i++)
if(*i==node2)
{
*i=-1;
break;
}
for(i=v[node].begin(); i!=v[node].end(); i++)
if(*i==node)
{
*i=-1;
break;
}
}
void add_edge(int node, int node2)
{
v[node].push_back(node2);
v[node2].push_back(node);
}
int valid(int node, int node2)
{
int nr=0;
vector<int>::iterator i;
for(i=v[node].begin(); i!=v[node].end(); i++)
if(*i!=-1)
nr++;
if(nr==1)
return 1;
bool visited[n];
memset(visited, false, n);
int nr1=dfs(node, visited);
remove_edge(node, node2);
memset(visited, false, n);
int nr2=dfs(node, visited);
add_edge(node, node2);
if(nr1>nr2)
return 0;
return 1;
}
void euler(int node)
{
int ok=1;
vector<int>::iterator i;
for(i=v[node].begin(); i!=v[node].end(); i++)
{
int node2=*i;
if(node2!=-1 && valid(node,node2))
{
remove_edge(node, node2);
fprintf(g,"%d ",node2);
cout<<node2;
euler(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;
}