日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

判断图有无环_判断无向图/有向图中是否存在环

發布時間:2024/9/15 编程问答 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 判断图有无环_判断无向图/有向图中是否存在环 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文主要針對如何判斷有向圖/無向圖中是否存在環的問題進行簡單的論述。

一 無向圖

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

總結

以上是生活随笔為你收集整理的判断图有无环_判断无向图/有向图中是否存在环的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。