問題描述
已知無向圖的鄰接矩陣,以該矩陣為基礎,給出深度優先搜索遍歷序列,並且給出該無向圖的連通分量的個數。
在遍歷時,當有多個點可選時,優先選擇編號小的頂點。
輸入說明:
第一行是1個正整數,為頂點個數n,頂點編號依次為0,1,…,n-1。后面是鄰接矩陣,n行n列。
輸出說明:
共2行。第一行輸出為無向圖的深度優先搜索遍歷序列,輸出為頂點編號,頂點編號之間用空格隔開;第二行為無向圖的連通分量的個數。
輸入樣例:
6
0 1 0 0 0 0
1 0 0 0 1 0
0 0 0 1 0 0
0 0 1 0 0 0
0 1 0 0 0 1
0 0 0 0 1 0
輸出樣例
0 1 4 5 2 3
2
提示
以鄰接矩陣為存儲結構,進行深度優先搜索遍歷,在遍歷的過程中計算無向圖連通分量的個數。
問題描述
已知無向圖的鄰接矩陣,以該矩陣為基礎,給出深度優先搜索遍歷序列,並且給出該無向圖的連通分量的個數。
在遍歷時,當有多個點可選時,優先選擇編號小的頂點。
輸入說明:
第一行是1個正整數,為頂點個數n,頂點編號依次為0,1,…,n-1。后面是鄰接矩陣,n行n列。
輸出說明:
共2行。第一行輸出為無向圖的深度優先搜索遍歷序列,輸出為頂點編號,頂點編號之間用空格隔開;第二行為無向圖的連通分量的個數。
輸入樣例:
6
0 1 0 0 0 0
1 0 0 0 1 0
0 0 0 1 0 0
0 0 1 0 0 0
0 1 0 0 0 1
0 0 0 0 1 0
輸出樣例
0 1 4 5 2 3
2
提示
以鄰接矩陣為存儲結構,進行深度優先搜索遍歷,在遍歷的過程中計算無向圖連通分量的個數。
#include<stdio.h> #include<stdlib.h> bool visited[100]; int G[100][100]; void DFS(int v, int vexnum) { visited[v] = true; printf("%d ", v); for (int i = 0; i < vexnum; i++) { if (visited[i] == false && G[v][i] != 0) DFS(i, vexnum); } } void DFSTraverse(int vexnum) { int i; int count = 0; for ( i = 0; i < vexnum; i++) visited[i] = false; for ( i = 0; i < vexnum; i++) { if (visited[i] == false) { DFS(i, vexnum); count++; } } printf("\n%d\n", count); } int main() { int i, j, vexnum; scanf("%d", & vexnum); for (i = 0; i < vexnum; i++) { for (j = 0; j < vexnum; j++) scanf("%d", &G[i][j]); } DFSTraverse(vexnum); }