dijkstra算法实现双向搜索

dijkstra算法实现双向搜索,第1张

首先,dijstra算法是贪心算法,不是搜索算法,不能双向搜索,双向的搜索一般是双向BFS算法。

其次,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)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12059977.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存