其次,A*算法是要根据具体问题制定A*函数,对任意图的效果不好。
再次,代码还是自己写比较好,能学会很多东西,一直这样问的话很难会有提高。
我的回答完毕了,希望看到具体问题。
你可以吧输入中的 a b当成 a b
b a
(就是进行两次输入就可以了)
其实算法主体都一样
就是输入上有点变动:
for (int i=0i!=m++i)
{
cin>>a>>b>>c
e[a][b]=e[b][a]=c
}
////////链表:
Edge* e[200000],*map[10000]
for (int i=0i!=m++i)
{
cin>>a>>b>>c
e[i+i].next=map[a]
map[a]=e+i+i
e[i+i].q=c
e[i+i+1].next=map[b]
map[b]=e+i+i+1
e[i+i+1].q=c
}
*首先我想说明几点问题。
1.我不知道你的题意中的路径是单向的还是双向的,不过我把路径设置成双向的了
2.说一下我程序的输入,首先输入一个n,表示该图中有n条路;然后有n行,每行
两个数x, y(1<=x, y<=99),表示这两个地点有一条路径。最后输入两个数,
表示计算这两点之间所有的路径
3.我的思路用的是深搜,不过广搜也是可以的
*/
#include <stdio.h>
#include <math.h>
int path[100][100]///path[i][j]为0表示i, j两点之间不通,为1表示有一条路
int stack[120], m=1, n, x, y///存储路径
void dfs(int p)
{
int i, j
for(i=1i<=100i++)
{
if(path[p][i]==1)
{
if(i == y)///如果深搜到了终点,就输出刚才经过的路径
{
for(j=0j<mj++)
{
printf("%-5d", stack[j])
}
printf("%-5d\n", y)
}
else///如果该点不是终点
{
stack[m] = i///将该点存起来
m++
dfs(i)///接着深搜
m--
}
}
}
}
int main()
{
int i, j
memset(path, 0, sizeof(path))
scanf("%d", &n)
for(i=0i<ni++)
{
scanf("%d %d", &x, &y)
path[x][y] = path[x][y] = 1///这两点之间有路径
}
scanf("%d %d", &x, &y)
stack[0] = x
dfs(x)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)