Dijkstra算法的核心思想就是两步排序,一个是对于一个点而言,他的最小边要经过所有其他点最小边的测试才能确认,也就是说要在这其中找一个最大的边出来;第二个是对于每次循环而言的,每次的更新d数组都是为了要选出最短的距离。
对于每次出队列的点,都更新他所有的邻边
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#define INF 65535
using namespace std; typedef pair<int,int> Node;
int n,m;
int G[][]; bool operator < (Node a,Node b)
{
return a.first > b.first;
} int Dijkstra()
{
int v,min;
int d[];
int vis[];
priority_queue<Node> q;
memset(vis,,sizeof(vis));
for(int i = ;i <= n;i++)
d[i] = INF;
d[] = ;
q.push(make_pair(d[],));
while(!q.empty()) {
Node t = q.top();
q.pop();
if(vis[t.second])
continue;
vis[t.second] = ;
for(int i = ;i <= n;i++)
if(!vis[i] && d[i] > t.first+G[t.second][i]) {
d[i] = t.first+G[t.second][i];
q.push(make_pair(d[i],i));
}
}
return d[n];
}
int main()
{
int x,y,w;
while(~scanf("%d%d",&n,&m))
{
if(!n && !m) break;
for(int i = ;i <= n;i++)
for(int j = ;j <= n;j++)
G[i][j] = i==j?:INF;
for(int i = ;i <= m;i++) {
scanf("%d%d%d",&x,&y,&w);
if(w < G[x][y])
G[x][y] = G[y][x] = w;
}
printf("%d\n",Dijkstra());
}
return ;
}

最新文章

  1. Listview上下滚动崩溃
  2. sizeof()用法
  3. FAQ:Python中*args和**agrs的区别
  4. CentOS 安装easy_install、pip的方法
  5. 为什么有时候必须添加sys.setdefaultencoding(&#39;utf-8&#39;)
  6. Android BottomNavigationBar导航栏
  7. Elasticsearch学习笔记三
  8. vue—data中变量和字符串拼接
  9. 最全的.NET Core跨平台微服务学习资源没有之一
  10. 关闭VS2017脚本调试 已启用 Visual Studio 中的 Chrome 脚本调试
  11. SpringBoot读取配置文件(从classpath/file读取yml/properties文件)
  12. Java 学习 注解
  13. linux下chmod使用
  14. ajax跨域名
  15. Repeter中列相同数据合并
  16. node.js开发web
  17. Python学习笔记之函数式编程
  18. AaronYang的留言板
  19. VLC媒体视频播放器 v3.0.2官方版
  20. 4 MySQL--表(增删改查)

热门文章

  1. Windows API一日一练(55)FlushFileBuffers和SetFilePointer函数
  2. Java基础知识强化96:Calendar类之获取任意年份的2月有多少天的案例
  3. codevs 1269 匈牙利游戏
  4. z-index优先级总结
  5. php function_name($type=0,$order_ids=&#39;&#39;,$flag=2)
  6. (转)javascript中return的作用
  7. .net中Web.config文件的基本原理及相关设置
  8. Android开发手记(7) 按钮类控件的使用
  9. 1201.1——Vim编辑器的相关操作
  10. Mac系统配置多个git账号