判斷圖的連通子圖個數

題目要求

給定一個具有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);
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章