问题描述
给定一个无向图,用邻接矩阵作为图的存储结构,输出指定顶点出发的深度优先遍历序列。在深度优先遍历的过程中,如果同时出现多个待访问的顶点,则优先选择编号最小的一个进行访问。
输入描述
第一行输入三个正整数,分别表示无向图的顶点数n(2≤n≤100,顶点从1到n编号)、边数m和指定起点编号s。
接下来的m行对应m条边,每行给出两个正整数,分别是该条边直接连通的两个顶点的编号。
输出描述
输出从 s开始的深度优先遍历序列,用一个空格隔开,最后也含有一个空格。如果从 s出发无法遍历到图中的所有顶点,则在第二行输出Non‑connected。
样例输入
5 4 1
1 2
3 1
5 2
2 3
样例输出
1 2 3 5
Non-connected
cpp
#include<stdio.h>
#define MVNUM 10 //最大顶点数
typedef int VerTexType; //顶点数据类型为整型
typedef int ArcType; //边的权值为整型
typedef struct
{
VerTexType vexs[MVNUM];//顶点表
ArcType arcs[MVNUM][MVNUM]; //邻接矩阵
int vexnum, arcnum; //图当前的顶点数和边数
int visited[MVNUM];
}AMGraph;
static int LocateVex(AMGraph G, int v) //在图中查找顶点
{
for (int i = 0; i < G.vexnum; i++)
if (v == G.vexs[i])
return i;
return -1;
}
static void CreateUDG(AMGraph &G) //创建无向网
{
for (int i = 0; i < G.vexnum; i++) //创建顶点表
{
G.vexs[i] = i + 1;
G.visited[i+1] = 0; //未搜索的顶点标记为0
}
for (int i = 0; i < G.vexnum; i++) //邻接矩阵元素置零
for (int j = 0; j < G.vexnum; j++)
G.arcs[i][j] = 0;
for (int k = 0; k < G.arcnum; k++)
{
int v1 = 0, v2 = 0;
scanf("%d%d", &v1, &v2);
int i = LocateVex(G, v1);
int j = LocateVex(G, v2);
G.arcs[i][j] = 1;
G.arcs[j][i] = 1;
}
return;
}
int count = 0;
static void DFS(AMGraph &G, int v)
{
count++;
printf("%d ", v);
G.visited[v] = 1; //访问过的顶点标记为1
for (int j = 1; j <= G.vexnum; j++)
if (G.arcs[v-1][j-1] && !G.visited[j])
DFS(G, j); //递归调用
}
int main()
{
int s = 0; //指定起点编号
AMGraph G;
scanf("%d%d%d", &G.vexnum, &G.arcnum, &s);
CreateUDG(G);
DFS(G, s);
if (count < G.vexnum)
printf("\nNon-connected");
return 0;
}