dfs判斷連通圖(無向)


圖論中,連通圖基於連通的概念。在一個 無向圖 G 中,若從 頂點vi到頂點vj有路徑相連(當然從vj到vi也一定有路徑),則稱vi和vj是連通的。如果 G 是 有向圖,那么連接vi和vj的路徑中所有的邊都必須同向。如果圖中任意兩點都是連通的,那么圖被稱作連通圖。如果此圖是有向圖,則稱為強連通圖(注意:需要雙向都有路徑)。圖的 連通性是圖的基本性質。
 

嚴格定義(摘抄):

對一個圖 G=( V, E) 中的兩點 xy ,若存在交替的 頂點和邊的序列
Γ=(x=v0-e1-v1-e2-...-ek-(vk+1)=y) (在 有向圖中要求有向邊vi−( vi+1)屬於 E ),則兩點 xy 是連通的。Γ是一條 xy的連通路徑, xy分別是起點和終點。當 x = y 時,Γ 被稱為回路。如果通路 Γ 中的邊兩兩不同,則 Γ 是一條簡單通路,否則為一條復雜通路。如果圖 G 中每兩點間皆連通,則 G 是連通圖。
 
基本方法:
簡單的隨便從一個點開始bfs,每遍歷到一個點都將那個點打好標記,並且統計個數,在dfs退出以后比較統計的連通的點的個數是否等於我們的節點個數,等於則是連通圖,不等則不是連通圖。
 
代碼如下:
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <vector>
 4 using namespace std;
 5 
 6 const int maxn = 1000 + 5;
 7 
 8 int n,m;
 9 int my_index;
10 
11 vector<int >G[maxn];
12 bool vis[maxn];
13 
14 void dfs(int u){
15   my_index++;
16   vis[u] = true;
17   for(int i = 0;i < G[u].size(); i++){
18     int v = G[u][i];
19     if(!vis[v])dfs(v);
20   }
21 }
22 
23 int main(){
24   scanf("%d%d",&n,&m);
25   for(int i = 1;i <= m; i++){
26     int a,b;
27     scanf("%d%d",&a,&b);
28     G[a].push_back(b);
29     G[b].push_back(a);
30   }
31   dfs(1);
32   if(n == my_index)printf("Yes\n");
33   else printf("No\n");
34 }

 


免責聲明!

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



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