題目要求
給定一個具有n個頂點、m條邊的無向圖G,假設項點的編號爲1-n。基於深度優先搜索算法,編寫程序
求無向圖G連通子圖的個數。
輸入格式:
第一行兩個整數n, m,分別表示圖G的頂點數和邊的數量。
下面m行的每-行有兩個整數a和b,分別表示頂點a和頂點b有一條邊相連。
輸出格式:
輸出一個整數,表示圖G中連通子圖的數量。
輸入樣例:
5 3
1 2
1 3
4 5
輸出樣例:
2
思路
由於圖的深度優先遍歷算法對n個節點調用之前會判斷該節點是否遍歷過,如果已遍歷就跳過,否則調用DFS算法,所以DFS算法的調用次數就是圖中聯通子圖的個數。
代碼實現
#include <stdio.h>
#define MAXNUM 1000
int Group[MAXNUM]; //記錄圖中節點是否被訪問過
int dist[MAXNUM][MAXNUM]; //通過鄰接矩陣保存圖
void DFS(int i, int n);
int main()
{
int n, m, p, q, k = 0;
for (int i = 0; i < MAXNUM; i++)
{
for (int j = 0; j < MAXNUM; j++)
dist[i][j] = 0; //初始化鄰接矩陣,初始值爲0
Group[i] = 0; //同上
}
scanf("%d%d", &n, &m); //獲取圖的節點數n,和邊數m
for (int i = 0; i < m; i++)
{
scanf("%d%d", &p, &q);
dist[p-1][q-1] = 1; //如果節點1和節3相連 則另dist[1][3]和dist[3][1]的值爲1
dist[q-1][p-1] = 1;
}
for (int i = 0; i < n; i++)
{
if (Group[i] != 1)
{
DFS(i, n);
k++; //執行一次DFS就是k的值自增1,
}
}
printf("%d", k);
system("pause");
return 0;
}
void DFS(int i,int n)
{
Group[i] = 1;
for (int j = 0; j < n; j++)
{
if (dist[i][j] == 1)
if (Group[j] != 1)
DFS(j, n);
}
}