标签:
欧拉路径和欧拉回路
欧拉路径:从某结点出发一笔画成所经过的路线叫做欧拉路径。
欧拉回路:在欧拉路径的基础上又回到起点。
a、凡是由偶点组成的连通图,一定可以一笔画成。画时可以把任一偶点为起点,最后一定能以这个点为
终点画完此图。
b、凡是只有两个奇点的连通图(其余都为偶点),一定可以一笔画成。画时必须把一个奇点为起点,另
一个奇点终点。
c、其他情况的图都不能一笔画出。(有偶数个奇点除以2便可算出此图需几笔画成。)
欧拉回路和欧拉路径的判断
欧拉回路:
无向图:每个顶点的度数都是偶数,则存在欧拉回路。
有向图:每个顶点的入度都等于出度,则存在欧拉回路。
欧拉路径:
无向图:当且仅当该图所有顶点的度数为偶数 或者 除了两个度数为奇数外其余的全是偶数。
有向图:当且仅当该图所有顶点 出度=入度 或者 一个顶点 出度=入度+1,另一个顶点 入度=出度+1,其
他顶点 出度=入度。
怎么求一条欧拉路呐?
Fleury算法伪代码:
DFS(u): While (u存在未被删除的边e(u,v)) 删除边e(u,v) DFS(v) End PathSize ← PathSize + 1 Path[ PathSize ] ← u
看得更懂一点就是这个:
void dfs(int u) { int d; while((d = G[u].size()) > 0) { int v = G[u][0]; // cout << v << " " << d << endl; G[u].erase(G[u].begin()); int l = G[v].size(); for(int i = 0; i < l; i ++) { //找到与u相连的v的与u的连边,因为两边是相互的,要相互删除 (无向图) if(G[v][i] == u) { G[v].erase(G[v].begin() + i); break; } } dfs(v); } path[pathsize ++] = u; }
或者是用 数组模拟临接矩阵:(删边的话 把G[u][v]=G[v][u]=-1 做个标记即可)
void dfs(int u) { int d = G[u].size(); for(int i = 0; i < d; i ++) { int v = G[u][i]; if(v != -1) { G[u][i] = -1; int l = G[v].size(); for(int j = 0; j < l; j ++) { //找到与u相连的v的与u的连边,因为两边是相互的,要相互删除 if(G[v][j] == u) { G[v][j] = -1; break; } } dfs(v); } } path[pathsize ++] = u; }
至于正确性方面的问题。 我现在是没有明白的。待下次明白。
标签:
原文地址:http://www.cnblogs.com/cherry231/p/5191468.html