求助一个算法问题

tianshilei1992 2011-12-15 01:41:13
向各位朋友们请教2个算法问题
1.现在给定一个无向图,然后要求输出从给定结点到给定结点经过结点数目最少的路径。
2.依然给定一个无向图,要求输出从给定结点到给定结点所有简单路径。

第1个用广度优先遍历吗?
第2个直接就没思路……

请大家帮帮忙,这个周做课程设计,明天就要上交了。第一个算法用广度优先遍历写出来的结果不正确……

图用的是邻接矩阵存储的,不知道这样是不是会麻烦?因为其他的函数用邻接矩阵写方便,所以就用了邻接矩阵。
...全文
95 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianshilei1992 2011-12-15
  • 打赏
  • 举报
回复
H[Quote=引用 4 楼 qq120848369 的回复:]

引用 3 楼 tianshilei1992 的回复:

引用 1 楼 qq120848369 的回复:

1, 广搜 / floyd
2,深搜
上面那个格式没了,这次重新来~~
C/C++ code

/*求v相当于w的下一个邻接点*/
int NextAdjVertex(AdjMatrix g, int v, int w)
{
int i;
for (i = w + ……
[/Quote]好的,谢谢啦!
qq120848369 2011-12-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 tianshilei1992 的回复:]

引用 1 楼 qq120848369 的回复:

1, 广搜 / floyd
2,深搜
上面那个格式没了,这次重新来~~
C/C++ code

/*求v相当于w的下一个邻接点*/
int NextAdjVertex(AdjMatrix g, int v, int w)
{
int i;
for (i = w + 1; i < g.vexnum; i++)
……
[/Quote]

思路都对,代码自己研究吧。
tianshilei1992 2011-12-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 qq120848369 的回复:]

1, 广搜 / floyd
2,深搜
[/Quote]上面那个格式没了,这次重新来~~

/*求v相当于w的下一个邻接点*/
int NextAdjVertex(AdjMatrix g, int v, int w)
{
int i;
for (i = w + 1; i < g.vexnum; i++)
if (g.arcs[v][i].adj != INFINITY && g.arcs[v][i].adj != 0) return(i);
return(-1);
}

/*求v的第一个邻接点*/
int FirstAdjVertex(AdjMatrix g, int v)
{
int i;
for (i = 0; i < g.vexnum; i++)
if (g.arcs[v][i].adj != INFINITY && g.arcs[v][i].adj != 0) return(i);
return(-1);
}

int visited2[MAX_VERTEX_NUM];//广度优先遍历访问标志数组

/*最短简单路径查询(中转次数最少)广度优先遍历图g*/
void ShortestPath(AdjMatrix g, int v0, int v)
{
int vi, w;
for (vi = 0; vi < g.vexnum; vi++) visited2[vi] = False;
printf("\t\t");
visit(v0);
visited2[v0] = True;
LinkQueue Q;
InitQueue(&Q);
EnterQueue(&Q, v0);
while (!Empty(Q))
{
DeleteQueue(&Q, &v);
w = FirstAdjVertex(g, v);
while (w != -1)//邻接点存在
{
if (!visited2[w])
{
visit(w);
visited2[w] = True;
EnterQueue(&Q, w);
}
w = NextAdjVertex(g, v, w);
}
}
printf("%d", v);
}
tianshilei1992 2011-12-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 qq120848369 的回复:]

1, 广搜 / floyd
2,深搜
[/Quote]第一个用Floyd算法就是把所有的权值都赋值为1是吧?然后广度优先遍历得到的结果不正确啊?大侠帮忙看看代码哪里有问题?
/*求v相当于w的下一个邻接点*/
int NextAdjVertex(AdjMatrix g, int v, int w)
{
int i;
for (i = w + 1; i < g.vexnum; i++)
if (g.arcs[v][i].adj != INFINITY && g.arcs[v][i].adj != 0) return(i);
return(-1);
}

/*求v的第一个邻接点*/
int FirstAdjVertex(AdjMatrix g, int v)
{
int i;
for (i = 0; i < g.vexnum; i++)
if (g.arcs[v][i].adj != INFINITY && g.arcs[v][i].adj != 0) return(i);
return(-1);
}

int visited2[MAX_VERTEX_NUM];//广度优先遍历访问标志数组

/*最短简单路径查询(中转次数最少)广度优先遍历图g*/
void ShortestPath(AdjMatrix g, int v0, int v)
{
int vi, w;
for (vi = 0; vi < g.vexnum; vi++) visited2[vi] = False;
printf("\t\t");
visit(v0);
visited2[v0] = True;
LinkQueue Q;
InitQueue(&Q);
EnterQueue(&Q, v0);
while (!Empty(Q))
{
DeleteQueue(&Q, &v);
w = FirstAdjVertex(g, v);
while (w != -1)//邻接点存在
{
if (!visited2[w])
{
visit(w);
visited2[w] = True;
EnterQueue(&Q, w);
}
w = NextAdjVertex(g, v, w);
}
}
printf("%d", v);
}
qq120848369 2011-12-15
  • 打赏
  • 举报
回复
1, 广搜 / floyd
2,深搜

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧