個人總結一下:
總的來說,可以用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 }