题目
在本题中,读入一个无向图的邻接矩阵(即数组表示),建立无向图并按照以上描述中的算法遍历所有顶点,输出遍历顶点的顺序
输入
输入的第一行包含一个正整数n,表示图中共有n个顶点。其中n不超过50。
以后的n行中每行有n个用空格隔开的整数0或1,对于第i行的第j个0或1,1表示第i个顶点和第j个顶点有直接连接,0表示没有直接连接。当i和j相等的时候,保证对应的整数为0。
输入保证邻接矩阵为对称矩阵,即输入的图一定是无向图。
输出
只有一行,包含n个整数,表示按照题目描述中的深度优先遍历算法遍历整个图的访问顶点顺序。每个整数后输出一个空格,并请注意行尾输出换行。
样例输入
4 0 1 0 1 1 0 0 0 0 0 0 1 1 0 1 0
样例输出
0 1 3 2
完整源代码
#include <iostream>
#include <iomanip>
#include <cstdio>
using namespace std;
#define MVNum 100 //最大顶点数
typedef string VerTexType; //假设顶点的数据类型为字符串
typedef int ArcType; //假设边的权值类型为整型
bool visited[MVNum];//标志数组用于判断顶点是否已经被访问
//------------图的邻接矩阵------------------
typedef struct {
VerTexType vexs[MVNum]; //顶点表
ArcType arcs[MVNum][MVNum]; //邻接矩阵
int vexnum, arcnum; //图的当前点数和边数
} Graph;
//得到顶点i的数据
VerTexType Vertexdata(const Graph& g, int i)
{
return g.vexs[i];
}
int LocateVex(const Graph& g, VerTexType v)
{
//确定点v在G中的位置
for (int i = 0; i < g.vexnum; ++i)
if (g.vexs[i] == v)
return i;
return -1;
}//LocateVex
int FirstAdjVex(const Graph& g, int v)
{
//返回v的第一个邻接点编号,没有返回-1
/****在此下面完成代码***************/
int j;
for (j = 0; j < g.vexnum; j++)
if (g.arcs[v][j] == 1)
return j;
return -1;
/***********************************/
}//FirstAdjVex
int NextAdjVex(const Graph& g, int v, int w)
{
//返回v相对于w的下一个邻接点,没有返回-1
/****在此下面完成代码***************/
int i;
for (i = w + 1; i < g.vexnum; i++)
{
if (g.arcs[v][i] == 1)
return i;
}
return -1;
/***********************************/
}//NextAdjVex
void DFS(Graph g, int v)
{
cout << v << " ";
visited[v] = 1;//访问第v个顶点,并置标志数组相应分量为true
for (int w = FirstAdjVex(g, v); w>=0; w = NextAdjVex(g, v, w))
{
//FirstAdjVex(g, v)表示v的第一个邻接点
//w>=0表示存在邻接点
// NextAdjVex(g, v, w)表示v相对于w的下一个邻接点
if (!visited[w])//若对v的尚未访问的邻接顶点w递归调用DFS()
DFS(g, w);
}
}
void CreateUDG(Graph& g)
{
//采用邻接矩阵表示法,创建无向图G
/****在此下面完成代码***************/
cin >> g.vexnum;
for (int i = 0; i < g.vexnum; i++)
{
for (int j = 0; j < g.vexnum; j++)
{
cin >> g.arcs[i][j];
}
}
/***********************************/
}//CreateUDN
void DestroyUDG(Graph& g)
{
//you should do this
g.arcnum = g.vexnum = 0;
}
int main()
{
Graph g; int v;
CreateUDG(g);
DFS(g, 0);
DestroyUDG(g);
return 0;
}//main