Dijkstra算法描述起来比较容易:它是求单源最短路径的,也就是求某一个点到其他各个点的最短路径,大体思想和prim算法差不多,有个数组dis,用来保存源点到其它各个点的距离,刚开始很好办,只需要把邻接矩阵里面它到其它点的距离复制过来就行了。剩下的步骤就是找到一个源点到其他点最小的距离,将它加入到已经确定下来的最短距离中,接着更新其他点到源点的距离,因为确定了一些点的最近距离之后,那么到其它未确定的点的距离可能会变小,所以更新一下。

理论完了 就要实践:http://acm.hdu.edu.cn/showproblem.php?pid=1874

AC代码:

 #include<iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = ;
const int INFINITY = ;
int Map[N][N];
void init(int n)
{
for (int i = ; i < n; i++)
for (int j = ; j < n; j++)
Map[i][j] = INFINITY;
}
//v0代表源点,n是总数,dis数组表示到其他点的距离
void dijkstra(int v0, int n, int dis[])
{
//标记是否已经找到最短距离
bool Final[n];
memset(Final, false, sizeof(Final));
for (int i = ; i < n; i++)
dis[i] = Map[v0][i];
dis[v0] = ;
//源点已经找到
Final[v0] = true;
int min_dis;
for (int i = ; i < n; i++)
{
min_dis = INFINITY;//找剩下的所有点中最小的一个
int k = ;
for (int j = ; j < n; j++)
{
if (!Final[j] && dis[j] < min_dis)
{
min_dis = dis[j];
k = j;
}
}
//如果最小的存在,就将它标记已经找到最短距离
if (min_dis < INFINITY)
Final[k] = true;
else
break;//如果找不到最小的,就是不连通图
for (int j = ; j < n; j++)//更新其他点到它的距离
{
if (!Final[j] && min_dis + Map[k][j] < dis[j])
{
dis[j] = min_dis + Map[k][j];
}
}
}
}
int main()
{
int n, m;
while (~scanf("%d %d", &n, &m))
{
init(n);
int a, b, x;
for (int i = ; i < m; i++)
{
scanf("%d %d %d", &a, &b, &x);
//两个城市之间的道路可能有多条,取最小的那条
if (Map[a][b] > x)
Map[a][b] = Map[b][a] = x;
}
int s, e;
scanf("%d %d", &s, &e);
int ans[n];
dijkstra(s, n, ans);
if (ans[e] < INFINITY)
printf("%d\n", ans[e]);
else
puts("-1");
} return ;
}

如果求任意两点之间的最短距离的话,Dijkstra的时间复杂度是O(n^3),用Floyd的话也是O(n^3),但是代码更简洁,更稠密的图实际运行效率更快。它的主要思路就是:因为求任意两点之间的最短距离,那么它得用一个二维数组来实现,其实这个二位数组就可以用邻接矩阵来表示,刚开始是一个点到另外一个点的直接距离,直接距离就是指不经过第三个点可以的距离,算法的整个精髓就是,求点v->w的最短距离,用另外一个点来作为中间点,求v->u>w的距离,如果后者的距离小于前者的距离,就更新v->w的距离。代码一共三层for循环,第一层的意思就是除了这行这列的之外的任意两点之间的距离 通过这个点来作为中间点,一共n个点,所以循环n次,二三两层for循环是从第二个for循环里的点到第三个for循环里的点与通过中间点就行比较。核心代码如下:

 void Floyd(int n)
{
for (int i = ; i < n; i++)
for (int j = ; j < n; j++)
for (int k = ; k < n; k++)
if (Map[j][i] + Map[i][k] < Map[j][k])
Map[j][k] = Map[j][i] + Map[i][k];
}

还是这个题,附AC代码:

 #include<iostream>
#include <cstdio>
using namespace std;
const int N = ;
const int INFINITY = ;
int Map[N][N];
void init(int n)
{
for (int i = ; i < n; i++)
for (int j = ; j < n; j++)
if (i != j)
Map[i][j] = INFINITY;
}
void Floyd(int n)
{
for (int i = ; i < n; i++)
for (int j = ; j < n; j++)
for (int k = ; k < n; k++)
if (Map[j][i] + Map[i][k] < Map[j][k])
Map[j][k] = Map[j][i] + Map[i][k];
}
int main()
{
int n, m;
while (~scanf("%d %d", &n, &m))
{
init(n);
int a, b, x;
for (int i = ; i < m; i++)
{
scanf("%d %d %d", &a, &b, &x);
if (Map[a][b] > x)
{
Map[a][b] = Map[b][a] = x;
}
}
Floyd(n);
int s, e;
scanf("%d %d", &s, &e);
if (Map[s][e] < INFINITY)
printf("%d\n", Map[s][e]);
else
puts("-1");
} return ;
}

Dijkstra算法and Floyd算法 HDU 1874 畅通工程续的更多相关文章

  1. ACM: HDU 1874 畅通工程续-Dijkstra算法

    HDU 1874 畅通工程续 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Desc ...

  2. HDU 1874 畅通工程续-- Dijkstra算法详解 单源点最短路问题

    参考 此题Dijkstra算法,一次AC.这个算法时间复杂度O(n2)附上该算法的演示图(来自维基百科): 附上:  迪科斯彻算法分解(优酷) problem link -> HDU 1874 ...

  3. HDU 1874畅通工程续(迪杰斯特拉算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 畅通工程续 Time Limit: 3000/1000 MS (Java/Others)     ...

  4. hdu 1874 畅通工程续

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1874 畅通工程续 Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过 ...

  5. HDU 1874 畅通工程续【Floyd算法实现】

    畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  6. hdu 1874 畅通工程续(求最短距离,dijkstra,floyd)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1874 /************************************************* ...

  7. hdu 1874 畅通工程续 Dijkstra

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 题目分析:输入起点和终点,顶点的个数,已连通的边. 输出起点到终点的最短路径,若不存在,输出-1 ...

  8. hdu 1874 畅通工程续(迪杰斯特拉优先队列,floyd,spfa)

    畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  9. HDU 1874 畅通工程续(最短路/spfa Dijkstra 邻接矩阵+邻接表)

    题目链接: 传送门 畅通工程续 Time Limit: 1000MS     Memory Limit: 65536K Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路. ...

  10. HDU——1874畅通工程续(Dijkstra与SPFA)

    畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

随机推荐

  1. TCP连接的状态分析

    1.先来了解一下TCP连接建立与关闭过程中的各种状态: CLOSED:初始状态,表示没有任何连接.LISTEN:Server端的某个Socket正在监听来自远方的TCP端口的连接请求.SYN_SENT ...

  2. rhel安装eclipse

    smb --> IDE --> 环境gcc(开发c) g++(开发c++)c++操作linux --> sqlite数据库linux平台自带sqlite数据库 基本SQL语言划分:D ...

  3. id class

    id 选择器可以为标有特定 id 的 HTML 元素指定特定的样式. HTML元素以id属性来设置id选择器,CSS 中 id 选择器以 "#" 来定义. 以下的样式规则应用于元素 ...

  4. Bootstrap中的 Typeahead 组件

    Bootstrap 中的 Typeahead 组件其实就是嵌入到其中的typeahead.js插件,可以完成输入框的自动匹配功能,在通过一些人工的调整基本可以胜任所有的匹配功能和场景,下面介绍下简单的 ...

  5. HTML&CSS基础学习笔记1.31-像素和相对长度

    像素和相对长度 之前的笔记中,我们提到过用属性width.height来设置图片的尺寸,它们的单元都是”px(像素)”.长度单位总结一下,目前比较常用到px(像素).em.% 百分比,要注意其实这三种 ...

  6. 关于Chrome(谷歌浏览器)对docume,准确获取网页客户区的宽高、滚动条宽高、滚动条Left和Top

    对于document.compatMode,很多朋友可能都根我一样很少接触,知道他的存在却不清楚他的用途.今天在ext中看到 document.compatMode的使用,感觉这个对于我们开发兼容性的 ...

  7. 委托的lambda表达式

    委托可以用 Lambda 表达式的方法来表示,很多C#的代码都会大量使用 Lambda 表达式,正确理解它的用法还是很重要的. 基础规则: Lambda 运算符 “=>” 左边表示委托实例所需要 ...

  8. iOS开发之WKWebView简单使用

    iOS开发之WKWebView简单使用   iOS开发之 WKWebVeiw使用 想用UIWebVeiw做的,但是突然想起来在iOS8中出了一个新的WKWebView,算是UIWebVeiw的升级版. ...

  9. LINQ to SQL 建立实体类

    使用LINQ to SQL时,需要首先建立用于映射数据库对象的模型,也就是实体类.在运行时,LINQ to SQL 根据LINQ表达式或查询运算符生成SQL语句,发送到数据库进行操作.数据库返回后,L ...

  10. 关于泥水佬的minihttp与MVC4的对比

    相同的功能: 在Action里面实现调用Redis服务端的时间戳,然后转成“yyyy-MM-dd HH:mm:ss”格式的字符串,显示在界面上,显示结果是一样的: 下面分别贴上用ab压的结果: 先是M ...