#include<iostream> using namespace std; #include<string.h> int dis[201][201], ans[201]; bool vis[201]; int i, j; void djstla(int begin, int end, int n) { memset(ans, 0x1f, sizeof(ans)); memset(vis, 0, sizeof(vis)); ans[begin] = 0; for (i = 1; i <= n; i++) { int min = 10000000, num = 300; for (j = 1; j <= n; j++) { if (!vis[j] && min > ans[j]) { min = ans[j]; num = j; } } /*if (num != 300) {*/ vis[num] = 1; for (j = 1; j <= n; j++) { if (!vis[j] && ans[j]>ans[num] + dis[num][j]) { ans[j] = ans[num] + dis[num][j]; } } /*} else { break; }*/ } /*if (ans[end] < 0x1f)*/ cout << ans[end] << endl; /*else cout << -1 << endl;*/ } int main() { int n, m; while (cin >> n >> m) { if(n==0&&m==0) break; memset(dis, 0x1f, sizeof(dis));//初始化为无穷大 for (i = 0; i < m; i++) { int a, b, c; cin >> a >> b >> c; if(dis[a][b]>c) dis[a][b] = dis[b][a] = c;//假如存在两点之间不止一条路,取较小的一条 } for (i = 1; i <= n; i++) dis[i][i] = 0; int be, end; /*while (cin >> be >> end) { djstla(be, end, n); }*/ //用于一组数据不同点的测试 //cin >> be >> end; be = 1, end = n; djstla(be, end, n); } return 0; }
这是一段关于Djstla算法进行最短路判断的代码。
用于HDU 2544 的最短路测试通过。
但是还存在的问题是关于memset这个初始化初始化最大值的问题(这段代码用的无穷大是我在网上粗略找的一个...可能不一定很适合)。
代码中Djstla函数中有一个判断num的过程,这个操作的用法在于判断输入的两个点之间是否存在路线,可以用于另外的题。
最后,最重要的。这道题只适用于路径的值为正值,假如有负值,则不适合这个算法。
第一次尝试分享代码,可能还有错误,请多多指教。
最短路(Djstla算法)
最新推荐文章于 2025-01-30 23:25:48 发布