数据结构中图的深度遍历问题:

#include<stdio.h>#defineMaxsize10typedefstructgraph{intvertex[Maxsize];//存放顶点的数组intar... # 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, &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,
这很明显是不对的 ,怎么解释,遍历代码是从书上抄的,肯定没有问题。
展开
 我来答
爱生活的翟先森
2012-11-24 · TA获得超过163个赞
知道答主
回答量:50
采纳率:0%
帮助的人:36.2万
展开全部
程序我没看哈。就回答你最后那几句话:同一个图,同一个开始点,深度搜索出来的结果仍然肯能不同啊。就如你上面的图,V0-V1-V2-V3 和V0-V3-V1-v2都是符合的。更何况你输入的顶点顺序不同呢。但像你上面举得那个例子,那明显就是错的,这时就说明你代码有问题,自己调试吧兄弟。
更多追问追答
追问
我也知道从同一个点开始进行同一种遍历可能结果不同,但是就上面的这例子,访问完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;

}


结果有点小问题,这你自己去思考吧。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式