点击打开题目链接

迪杰斯特拉的用法不多讲,详见  点击打开链接 。

下面两个代码:

这个是用邻接矩阵存图的迪杰斯特拉。

#include<stdio.h>
int main()
{ int e[1005][1005],dis[1005],book[1005],i,j,n,m,t1,t2,t3,u,v,min;
int inf=9999999;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(m==n&&n==0) return 0;
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
if(i==j) e[i][j]=0;
else e[i][j]=inf; }
}
for(i=1; i<=m; i++)
{
scanf("%d%d%d",&t1,&t2,&t3);
e[t1][t2]=e[t2][t1]=t3;
}
for(i=1; i<=n; i++)
{
dis[i]=e[1][i];
}
for(i=0; i<=n; i++)
{
book[i]=0;
}
book[1]=1; for(i=1; i<n; i++)
{
min=inf;
for(j=1; j<=n; j++)
{
if(book[j]==0&&dis[j]<min)
{
min=dis[j];
u=j; }
}
book[u]=1;
for(v=1; v<=n; v++)
{
if(e[u][v]<inf)
if(dis[v]>dis[u]+e[u][v])
dis[v]=dis[u]+e[u][v];
} }
// for(i=1; i<=n; i++)
printf("%d\n",dis[n]);
}
return 0;
}

用数组模拟邻接表的迪杰斯特拉:数组模拟邻接表详见 点击打开链接

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
#define MAX_SIZE 10005
const int INF=2e9+1e8; int start[MAX_SIZE],terminal[MAX_SIZE],value[MAX_SIZE];
int first[MAX_SIZE],nexts[MAX_SIZE],dis[MAX_SIZE],vis[MAX_SIZE];
int main()
{
int n,m,i,j,minn,k;
while(scanf("%d %d",&n,&m)!=EOF) // n个点m条边
{
if(n==m&&m==0) return 0;
for(i=1; i<=n; i++) // 初始化 first 数组
first[i]=-1;
for(i=1; i<=m; i++) // 存入m条边
{
int ss,ee,vv;
scanf("%d %d %d",&ss,&ee,&vv); start[i*2-1]=ss,terminal[i*2-1]=ee,value[i*2-1]=vv;
nexts[i*2-1]=first[start[i*2-1]];
first[start[i*2-1]]=i*2-1; start[i*2]=ee,terminal[i*2]=ss,value[i*2]=vv;
nexts[i*2]=first[start[i*2]];
first[start[i*2]]=i*2;
}
// 初始化 dis 数组
k=first[1];
for(i=1; i<=n; i++)
dis[i]=INF;
while(k!=-1)
{
dis[terminal[k]]=value[k];
k=nexts[k];
}
memset(vis,0,sizeof(vis)); // 标记当前位置是否来过 0 表示还没有来过
vis[1]=1;
int mid_pos;
int times=n-1;
// 迪杰斯特拉 核心代码
while(times--)
{
minn=INF;
for(j=1; j<=n; j++)
{
if(vis[j]==0&&dis[j]<minn)
{
minn=dis[j];
mid_pos=j;
}
}
if(minn==INF) continue;
vis[mid_pos]=1;
// 遍历 pos 点能到的地方
k=first[mid_pos];
while(k!=-1)
{
if(dis[mid_pos]+value[k]<dis[terminal[k]]) dis[terminal[k]]=dis[mid_pos]+value[k];
k=nexts[k];
}
}
// for(i=1; i<=n; i++)
// printf("%d ",dis[i]);
// printf("\n");
printf("%d\n",dis[n]);
}
return 0;
}

最新文章

  1. SharePoint 2013 母版页取消和HTML页关联
  2. SYSTick 定时器
  3. ubuntu下nginx+php5的部署
  4. 实现Base64加密解密
  5. ValidationExpression=&quot;http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&amp;=]*)?&quot; can not work
  6. lambda 表达式
  7. Erlang-特性
  8. linux下vi命令
  9. jQ $.extend用法
  10. Python [Leetcode 344]Reverse String
  11. 转:高性能Mysql主从架构的复制原理及配置详解
  12. css4激动人心的新特性及浏览器支持度
  13. Linux 内存优化
  14. 微信小程序之两个页面传值
  15. Python内置函数(32)——all
  16. [Swift]LeetCode162. 寻找峰值 | Find Peak Element
  17. CPU、GPU、CUDA、cuDNN
  18. (转)java中引用传递和值传递
  19. [Docker]Docker拉取,上传镜像到Harbor仓库
  20. CLR via C#--------CLR的执行模式

热门文章

  1. MarsEdit 快速插入代码
  2. LeetCode OJ--Evaluate Reverse Polish Notation
  3. cut printf awk sed grep笔记
  4. C# 读写bat文件
  5. Java获取指定时间段的年份(开始、结束时间)、月份(开始、结束时间)、天数(开始、结束时间)
  6. amplab
  7. filter过滤器实现特殊字符转义
  8. 游戏server主程白皮书-序言
  9. 转: 在CentOS 6.X 上面安装 Python 2.7.X
  10. 使用Python控制1602液晶屏实时显示时间(附PyCharm远程调试)