在
圖論中,連通圖基於連通的概念。在一個
無向圖 G 中,若從
頂點vi到頂點vj有路徑相連(當然從vj到vi也一定有路徑),則稱vi和vj是連通的。如果 G 是
有向圖,那么連接vi和vj的路徑中所有的邊都必須同向。如果圖中任意兩點都是連通的,那么圖被稱作連通圖。如果此圖是有向圖,則稱為強連通圖(注意:需要雙向都有路徑)。圖的
連通性是圖的基本性質。
嚴格定義(摘抄):
對一個圖
G=(
V,
E) 中的兩點
x 和
y ,若存在交替的
頂點和邊的序列
Γ=(x=v0-e1-v1-e2-...-ek-(vk+1)=y) (在
有向圖中要求有向邊vi−(
vi+1)屬於
E ),則兩點
x 和
y 是連通的。Γ是一條
x到
y的連通路徑,
x和
y分別是起點和終點。當
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 }