問題描述
已知無向圖的鄰接矩陣,以該矩陣為基礎,給出深度優先搜索遍歷序列,並且給出該無向圖的連通分量的個數。
在遍歷時,當有多個點可選時,優先選擇編號小的頂點。
輸入說明:
第一行是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);
}
