以前一直认为自己懂了,,,,然而。。。。
先来书上的定义
图G的一个回路,若它恰通过G中每条边一次,则称该回路为欧拉回路。具有欧拉回路的图成为欧拉图。
就是从图上的一点出发,经过所有的边必须且只能一次,最终回到起点的路径
基本算法:深度优先搜索
应用:使用深度优先搜索,如果某条边被搜索到,则标记这条边已为选择,并且即使回溯也不能将当前
边的状态改回未选择,每次回溯时,记录回溯路径。搜索结束后,记录的回溯路径就是欧拉回路。
欧拉图详解看这里
http://blog.csdn.net/u013480600/article/details/44805491
例题链接:
http://poj.org/problem?id=2230
分析:每条边要求正向反向各走一次,所以一定存在欧拉回路。
本题的要求不是输出边的序列,而是点的序列,其实是一样的,根据边的序列很容易确定点的序列
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cstdio>
using namespace std;
#define maxn 100005
int cnt;
struct node
{
int to;
int nxt;
};
int head[maxn];
node data[maxn];
int N,M;
int vis[maxn];
void add(int from ,int to)
{
data[cnt].to = to;
data[cnt].nxt = head[from];
head[from] = cnt++;
}
void DFS(int u)
{
for(int i = head[u] ; i != -1 ; i = data[i].nxt)
{
int v = data[i].to;
if( !vis[i] )
{
vis[i] = 1;
DFS(v);
}
}
cout << u << endl;
}
int main()
{
memset(head,-1,sizeof(head));
cin >> N >> M;
for(int i = 1 ; i <= M ; ++i)
{
int a, b;
scanf("%d %d",&a,&b);
add(a,b);
add(b,a);
}
DFS(1);
}