判斷一個圖是否連通


個人總結一下:

總的來說,可以用DFS(O(v^2))和BFS(O(v+e))的思想都能實現,只要從一個點出發,然后判斷是否能遍歷完所有的點。還有就是Tarjan算法和GABOW算法,這個沒研究過,據說很好用。

 

實現辦法一:用Floyd算法,時間復雜度為O(v^3),時間復雜度較大。

實現辦法二:拓撲排序(多用於有向圖)。

實現辦法三:用BFS和visa[]標志數組,看看從一個點出發,是否能訪問完所有的點。

實現辦法四:用DFS,(思想和辦法三相差無幾,遞歸用while循環代替而已)核心代碼如下:


用鄰接鏈表表示的圖

 1 void dfs(int s)
 2 {
 3       visit[s] = true;
 4       cnt++;
 5       node* p = vnode[s];
 6       for (;p; p = p->next)
 7       {
 8            if (!visit[p->v]) 
 9 
10                   dfs(p->v);
11       }
12       return;
13  }
14 
15 cnt為全局變量,當cnt與總結點數相等時,就連通。
16 
17 
18 
19 /*用了廣度優先搜索的思想*/
20 bool Connectivity_BFS(MGraph m)
21 {
22  queue<int> q;
23  bool visa[MAX_VERTEX_NUM];//之前先初始化為false
24  int count=0;
25  memset(visa,0,sizeof(visa));
26  q.push(1);
27  while(!q.empty())
28  {
29   int v=q.front();
30   visa[v]=true;
31   q.pop();
32   count++;
33   for(int i=1;i<=m.vexnum;i++)//把與v連通並且沒有被訪問過的結點壓進隊列里面。
34   {
35    if(m.arc[v][i].weight)
36     if(!visa[i])
37     {
38      q.push(i);
39      visa[i]=true;//標志被訪問過。
40     }
41   }
42  }
43  if(count==m.vexnum)//如果壓進棧的結點個數剛好等於總結點的個數,則連通。
44   return true;
45  return false;
46 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM