1、def:从图上一点出发,经过所有边且只能一次,最终能回到起点的回路。
2、满足条件
(1)连通,即无孤立点。
(2)对无向图:奇点个数为0;对有向图:每个点的入度等于出度。
3、变形:一笔画问题
(1)连通
(2)无向图:奇点个数为0或2,且为2的时候这两个顶一定是起点和终点;有向图:存在两个顶点,入度不等于出度。
练习:NYOJ42
#include
#include
#include
using namespace std;
struct node
{
int to;
int next;
}edge[2010*2];
int vis[1010];
int degeree[1010];
int head[2010];
/**确定无向图是否连通,如果所有点都被访问则说明无孤立点,即连通**/
void dfs(int x)
{
vis[x] = 1;
int i;
for(i = head[x]; i != -1; i = edge[i].next)
{
if(!vis[edge[i].to])
dfs(edge[i].to);
}
}
int visit[2*2010];
int ans[2010];
int ansi;
/*******如果存在欧拉回路,记录欧拉回路*********/
void DFS(int x)
{
int k;
for(k = head[x]; k != -1; k = edge[k].next)
{
if(!visit[k])
{
visit[k] = true;
visit[k^1] = true;
DFS(edge[k].to);
ans[ansi] = k; //保存边
cout<