数据结构中图的深度遍历问题:
typedef struct graph{
int vertex[Maxsize];//存放顶点的数组
int arc[Maxsize][Maxsize];//邻接矩阵二维数组
int visited[Maxsize];//顶点一位数组
int vertexNum;//图的顶点数
int arcNum;//图的边数}Graph;
void init(Graph G)
{
printf("请输入顶点的数:");
scanf("%d", &G.vertexNum);
printf("请输入边的数目:");
scanf("%d", &G.arcNum);
printf("请输入顶点的值:");
for (int i=0; i<G.vertexNum; i++)//初始化顶点数组
{
int val;//临时存放顶点的值;
scanf("%d", &val);
G.vertex[i] = val;
}
for (int v=0; v<G.vertexNum; v++)//初始化邻接矩阵 for (int j=0; j<G.vertexNum; j++)
{
G.arc[v][j] = 0;
}
printf("请输入边依附的顶点编号:");
for (int k=0; k<G.arcNum; k++)//建立图的邻接矩阵。 {
int i;
int j;
scanf("%d%d", &i, &i);
G.arc[i][j] = 1;
G.arc[j][i] = 1;
}
for (int r=0; r<G.vertexNum; r++)//初始化标记数组 {
G.visited[r] = 0;
}
}
void DFTraverse(Graph G, int v)//深度优先遍历{
printf("%d ", G.vertex[v]);
G.visited[v] = 1;
for (int i=0; i<G.vertexNum; i++) {
if (G.arc[v][i] == 1 && G.visited[i] == 0)
{
DFTraverse(G, i);
}
}
}
/*疑问:假如将ppt中的那个图进行初始化一个图,那么我们将图中的顶点依次按照:0, 1, 2, 3 输入并存在 顶点数组中。
然后再将边所依附的顶点输入:0 1 0 3 1 3 1 2 建立邻接矩阵。
当我们遍历的时候,先输出 vertex[0],值为0, 判断arc[0][1]; 满足条件,于是输出vertex[1]; 值为1;
这是遍历的时候根据邻接矩阵输出的, 只要开始建立的时候将边所依附的点输入的一样,不管是先输入的那个
边,最后建立的邻接矩阵都是一样的,所以进行遍历的时候假如都从0开始,肯定是先输出vertex[0]; vertex[1];
vertex[2];
问题在于:如果按照这种输出办法,那么我们将顶点保存到顶点数组vertex中的顺序不同,最后输出就不同。这很
显然不对啊。例如,第一种输入顶点的顺序是:0, 1, 2, 3,
遍历结果是:0, 1, 2, 3;
第二种输入顶点顺序为: 0, 2, 1, 3,
遍历结果是:0, 2, 1, 3; //很显然是错的,
因为第二次输入的时候vertex[0] = 0;
vertex[1] = 2;
*/
以不同 的顺序输入一个图的顶点,从同一点例如0.开始遍历,最后由于输入顶点的顺序不同而遍历结果不同,这这么解释????按道理说,同一个图,同一个开始点,遍历的结果应该是相同 的。
我也知道从同一个点开始也可能结果不同,但是就上面的 这个图,v0访问完了就应该访问v1或是v3
也不是v2啊,但是,我们将顶点的输入顺序为:v0, v2 , v1, v3,那么按照深度遍历函数可以看到输出的顺序为;v0 , v2, v1, v3,
这很明显是不对的 ,怎么解释,遍历代码是从书上抄的,肯定没有问题。 展开
我也知道从同一个点开始进行同一种遍历可能结果不同,但是就上面的这例子,访问完v0,肯定不是v2,要么是v3,或是v1啊,当将点的顺序输入为:v0,v2, v1, v3,但是按照深度遍历函数可以看到,访问完v0后,访问vertex[1],此时的vertex[1]为v2,所以很明显不对啊,上面的代码是我从书上抄的,应该没有问题。求解,解答有加分
你那代码是从哪里搞的,我改了好半天,你好歹把你跑的程序代码贴上来。没事儿给顶点赋值干嘛,老老实实初始化时0对应0,1对应1,正是没这样干,才把你搞糊涂啦,当然它这样做是为了在遍历时起点可改变。你输入0,2,1,3,就相当于v[0]=0,v[1]=2,v[2]=1,v[3]=3。现在假如我们从V0开始遍历,结果就是V0,V1,V2,V3,可你代码输出用的是 printf("%d ", G.vertex[v]);,即输出0,2,1,3。没错啊,这里0,2,1,3,又不是对应节点号。printf("%d ", v);改成这样就容易明白啦。
学习这个东西,头脑想不通,就自己学会跑程序。然后再不懂就把你跑的代码发上来。你这种大大浪费我的时间。
既然帮你就帮到底,下面是代码(你自己再修正一下):
# include <stdio.h>
# define Maxsize 10
typedef struct graph
{
int vertex[Maxsize];//存放顶点的数组
int arc[Maxsize][Maxsize];//邻接矩阵二维数组
int visited[Maxsize];//顶点一位数组
int vertexNum;//图的顶点数
int arcNum;//图的边数
}Graph;
void init(Graph &G)
{
printf("请输入顶点的数:");
scanf("%d", &G.vertexNum);
printf("请输入边的数目:");
scanf("%d", &G.arcNum);
printf("请输入顶点的值:");
for (int i=0; i<G.vertexNum; i++)//初始化顶点数组
{
int val;//临时存放顶点的值;
scanf("%d", &val);
G.vertex[i] = val;
}
for (int v=0; v<G.vertexNum; v++)//初始化邻接矩阵
for (int j=0; j<G.vertexNum; j++)
{
G.arc[v][j] = 0;
}
printf("请输入边依附的顶点编号:");
for (int k=0; k<G.arcNum; k++)//建立图的邻接矩阵。
{
int i;
int j;
scanf("%d-%d", &i, &j);
G.arc[i][j] = 1;
G.arc[j][i] = 1;
}
for (int r=0; r<G.vertexNum; r++)//初始化标记数组
{
G.visited[r] = 0;
}
}
void DFTraverse(Graph G, int v)//深度优先遍历
{
printf("%d ", v);
G.visited[v] = 1;
for (int i=0; i<G.vertexNum; i++)
{
if (G.arc[v][i] == 1 && G.visited[i] == 0)
DFTraverse(G, i);
}
}
int main()
{
Graph G;
init(G);
DFTraverse(G,1);
return 0;
}
结果有点小问题,这你自己去思考吧。