判断图有无环_判断无向图/有向图中是否存在环
本文主要針對如何判斷有向圖/無向圖中是否存在環的問題進行簡單的論述。
一 無向圖
1.利用DFS進行判斷
利用DFS判斷有向圖是否存在環,是最為常用的一種方法,雖然這種方法很常用,但可參考的代碼的實現比較少,下面對這種方法及其實現進行詳細的闡述。
首先,利用DFS判斷無向圖中是否換的原理是:若在深度優先搜索的過程中遇到回邊(即指向已經訪問過的頂點的邊),則必定存在環。
所以說,是否存在環的關鍵在于是否存在滿足條件的“回邊”,那么如何判斷回邊呢?
(1)首先,對圖中的所有頂點定義三種狀態:頂點未被訪問過、頂點剛開始被訪問、頂點被訪問過并且其所有鄰接點也被訪問過。這三種狀態,在visited數組中分別用0、1、2來表示。那么,存在環的情況可以定義為:在遍歷過程中,發現某個頂點的一條邊指向狀態1的頂點,此時就存在環。
(2)此外,我們要定義一個father數組,用以存儲在DFS過程中頂點的父頂點(或者說是生成樹上的父節點)。其主要作用是為了區分鄰接點中環中的頂點和遍歷過程中的父節點 (單純的用visited數組無法區分)。
整個過程的實現代碼如下:
#define MAX_NUM 100
#define INF 0x7fffffff
/*DFS判斷無向圖中是否有環*/
class Graph
{
public:
int vertexNum;//頂點個數
int arcNum;//弧的個數
int vertex[MAX_NUM];//頂點表
int arc[MAX_NUM][MAX_NUM];//弧信息表
};
int visited[MAX_NUM];//頂點訪問表
int father[MAX_NUM];//父節點表問表
void DFS(int v,Graph G)
{
visited[v] = 1;
for(int i = 0 ; i < G.vertexNum; i++)
{
if(i != v && G.arc[v][i] != INF)//鄰接矩陣中節點v的鄰接點
{
if(visited[i] == 1 && father[i] != v)//不是父節點,而且還訪問過,說明存在環
{
cout<
int temp = v;
while(temp != i)
{
cout<";//輸出環
temp = father[temp];
}
cout<
}
else
if(visited[i] == 0)
{
father[i] = v;//更新father數組
DFS(i,G);
}
}
}
visited[v] = 2;//遍歷完所有的鄰接點才變為狀態2
}
void DFSTraverse(Graph G)
{
memset(visited,0,sizeof(visited));
memset(father,-1,sizeof(father));
for(int i = 0 ; i < G.vertexNum; i++)
if(!visited[i])
DFS(i,G);
}
由此可見,visited數組相對于一般的情況,增加了個狀態2,主要是為了防止在回溯過程中進行誤判。所以才能僅用father數組和狀態1判斷存在環。
由于使用的是鄰接矩陣來存儲,所以該算法的時間復雜度為O(n^2),空間復雜度為O(n)。
2.其他方法本文不再詳述。
二 有向圖
1.拓撲排序
關于拓撲排序,資料很多,本文不再詳述。
原文:https://www.cnblogs.com/wangkundentisy/p/9320499.html
總結
以上是生活随笔為你收集整理的判断图有无环_判断无向图/有向图中是否存在环的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 组合内容_剑与远征:亚龙组合成型,新的更
- 下一篇: 在没有任何数据时进行无效的读取尝试。_技