欧拉通路: 通过图中每条边且只通过一次,并且经过每一顶点的通路。
欧拉回路: 通过图中每条边且只通过一次,并且经过每一顶点的回路。
一:无向图是否具有欧拉通路或回路的判定:
欧拉通路:图连通;图中只有0个或2个度为奇数的节点
欧拉回路:图连通;图中所有节点度均为偶数
二:有向图是否具有欧拉通路或回路的判定:
欧拉通路:图连通;除2个端点外其余节点入度=出度;1个端点入度比出度大1;一个端点入度比出度小1 或 所有节点入度等于出度
欧拉回路:图连通;所有节点入度等于出度
求解欧拉路径的核心算法:void euler(int u) // 深度优先遍历的思想
{
for(int i = 0; i < G[u].size(); i++)
{
int v = G[u][i];
if(!visited[u][v])
{
visited[u][v] = visited[v][u] = 1;
euler(v);
cout<<u<<" "<<v<<endl; // 打印的是逆序,需要正序,就把边<u,v>压入栈中 :e.push(edge(u,v));
}
}
}
示例代码:
#include<iostream>
#include<vector>
#include<stack>
#include<windows.h>
#define N 1001
using namespace std;
bool visited[N][N];
int d[N];
vector<int> G[N];
stack<int> s;
void euler(int u)
{
for(int i = 0; i < G[u].size(); i++)
{
int v = G[u][i];
if(!visited[u][v])
{
visited[u][v] = visited[v][u] = 1;
euler(v);
cout<<u<<" "<<v<<endl; // 打印逆序的欧拉路径
}
}
}
int main()
{
int n,m,i;
cin>>n>>m;
for(i = 1; i <= m;i++)
{
int a,b;
cin>>a>>b;
G[a].push_back(b);
G[b].push_back(a);
d[a]++;
d[b]++;
}
euler(1);
system("pause");
return 0;
}