模板引用 http://www.cnblogs.com/mycapple/archive/2012/08/21/2649274.html
这个算法离散课张院长讲过 不过那个时候只是讲了算法的实现
并没有讲代码 不过算法的过程弄懂了 代码琢磨一下就弄懂了 就这样。
算法显示看别人的A的代码的 然后自己琢磨 能够自己打出来了
然后自己打出来 能A了。 。。。
下面是代码加自己写的注释。。。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define Max 0x3f3f3f3f
int m[10010][10010],p[10010]; // p是原点到各点最短路径数组
bool vis[10010]; // 标记数组
int vexnum,arcnum; // 点 边
void dijstra()
{
int i,k,t,min;
memset(vis,0,sizeof(vis)); // 清空
for(i=1;i<=vexnum;++i)
p[i]=m[1][i]; // p数组存储 1 到所有点的距离 // 也可以改成0 自定义
for(vis[1]=k=1;k<vexnum;++k)
{
for(min=Max ,i=1;i<=vexnum;++i)
{
// p[i]里面是存放原点到各点的最小值的 就是每一行的最小值 如果没有被标记 而且是这一行最小的 就放进去
if(!vis[i]&&min>p[i]) // 如果这个数字已经在标记的数组里面了 那么 跳过 如果这个数字没被标记 且是目前中这一行已遍历最小的 那么放进数组里面去
{
min=p[i];
t=i;
}
}
vis[t]=1;// 最后才标记位置 (最终的)
for(i=1;i<=vexnum;++i)
{
if(!vis[i]&&p[i]>min+m[t][i]) // 比较 1 到 i 和 1 到t + t到i 哪个更近一点
p[i]=min+m[t][i];
}
}
}
int main()
{
int i,j,a,b,w;
while(~scanf("%d%d",&vexnum,&arcnum),vexnum||arcnum)// 输入点 边
{
for(i=1;i<=vexnum;++i)
for(j=1;j<=vexnum;++j)
m[i][j]=m[j][i]=Max;// 各点重置为无穷
for(i=0;i<arcnum;++i){
scanf("%d%d%d",&a,&b,&w); // a 到 b点的距离
m[a][b]=m[b][a]=w; // 赋值
}
dijstra();
printf("%d\n",p[vexnum]);
}
//
// system("pause");
return 0;
}
以上~ 滚去看另一个算法了。。。
228

被折叠的 条评论
为什么被折叠?



