这篇博客是从旧博客 WordPress 迁移过来,内容可能存在转换异常。
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2544
Dijkstra最简单的应用---直接套模版。注意这一题要考虑重路,也就是输入的两点A,B相同,这时存储的要是其中最小的C。
Dijkstra分析与实现(C/C++)见: http://www.wutianqi.com/?p=1890
AC代码:
// Author: Tanky Woo
// Blog: www.WuTianqi.com
#include
using namespace std;
const int maxnum = 105;
const int maxint = 1001;
void Dijkstra(int n, int v, int *dist, int *prev, int c[maxnum][maxnum])
{
bool s[maxnum]; // 判断是否已存入该点到S集合中
for(int i=1; i<=n; ++i)
{
dist[i] = c[v][i];
s[i] = 0; // 初始都未用过该点
if(dist[i] == maxint)
prev[i] = 0;
else
prev[i] = v;
}
dist[v] = 0;
s[v] = 1;
// 依次将未放入S集合的结点中,取dist[]最小值的结点,放入结合S中
// 一旦S包含了所有V中顶点,dist就记录了从源点到所有其他顶点之间的最短路径长度
for(int i=2; i<=n; ++i)
{
int tmp = maxint;
int u = v;
// 找出当前未使用的点j的dist[j]最小值
for(int j=1; j<=n; ++j)
if((!s[j]) && dist[j]> p >> q >> len;
c[p][q] = len; // p指向q
c[q][p] = len; // q指向p,这样表示无向图
}
for(int i=1; i<=n; ++i)
dist[i] = maxint;
Dijkstra(n, 1, dist, prev, c);
// 最短路径长度
cout << dist[n] << endl;
}
return 0;
}