最短路——迪杰斯特拉算法 HDU_3790
初识最短路,今天只弄了一个迪杰斯特拉算法,而且还没弄成熟,只会最基本的O(n^2),想弄个优先队列都发现尼玛被坑爆了,那个不应该用迪杰斯特拉算法写
表示还是不会优化版的迪杰斯特拉算法,(使用优先队列),只会普通的O(n^2);
用HDU_3790来详解这个算法吧。
Description
Input
(1<n<=1000, 0<m<100000, s != t)
Output
Sample Input
1 2 5 6
2 3 4 5
1 3
0 0
Sample Output
在迪杰斯特拉算法里,除了必要的建图和初始化,核心部分其实很简单。。。而且理解了搜索路径的过程,更加方便。
初始化部分
d[]数组存放当前节点到源点的最短路径,除了d[源点]=0,其余全部设置为INF
v[i][j]数组存放从i到j的路程,在读入数据之前,全部设置为INF
vis[]数组用来存放已经得到最短路径的点,用该数组的目的是为了防止该点被再次搜索。
吃完饭之后忽然想到,有一点很重要没有提醒。。。在无向图里面,读入边权值时,需要v[i][j]=v[j][i]=权值,原因很简单,无向图。
核心部分
直接贴代码讲算了
#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 1<<30
int d[][];
int fee[][];
int distant[];
int p[];
int vis[];
int n,m;
void dijst(int be,int en)//迪杰斯特拉算法的核心部分。
{
memset(vis,,sizeof vis);//初始化vis数组
int i,j,k;
for (i=; i<=n; i++)//初始化每个节点的最短路程和费用,在搜索前,默认都为INF
{
distant[i]=maxn;
p[i]=maxn;
}
distant[be]=;//源点的最短路径设置为0
p[be]=;
for (i=; i<=n; i++)//遍历所有节点
{
int min=maxn,minloc=,minip=maxn;
for (j=; j<=n; j++) //找出当前还没vis过的节点中的最短路径点(第一次肯定是源点)。。由于这道题涉及费用比较,所以写得长了一些。
{
if (vis[j]) continue;
if (distant[j]<min)
{
min=distant[j];
minloc=j;
minip=p[j];
}
if (distant[j]==min&&min<maxn)
{
minloc= minip<=p[j]?minloc:j;
min=distant[minloc];
minip=p[minloc];
}
}
vis[minloc]=; //循环过后,minloc点必定是路径最小点,vis它一下。
for (k=; k<=n; k++)
{
if (vis[k]) continue;
if (d[k][minloc]==maxn) continue;
if (distant[k]>distant[minloc]+d[k][minloc]) //将上面找到的“源点”依次与所有点遍历一遍,这样基于该源点往下走的所有节点的“当前最短路”全部求出来了,当然没有路劲链接的点 长度为INF,所以不会改变,也不影响结果。
{
distant[k]=distant[minloc]+d[k][minloc];
p[k]=p[minloc]+fee[minloc][k];
}
if (distant[k]==distant[minloc]+d[k][minloc])
{
if (p[k]>p[minloc]+fee[minloc][k])
p[k]=p[minloc]+fee[minloc][k];
}
}
}
} int main()
{ while (scanf("%d %d",&n,&m)&&n)
{
int i,j,k;
for (i=; i<=n; i++)
{
for (j=; j<=n; j++)//初始化距离和费用
{
d[i][j]=maxn;
fee[i][j]=maxn;
}
}
for (i=; i<m; i++)
{
int a,b,c,e;
scanf("%d %d %d %d",&a,&b,&c,&e);
if (d[a][b]>c) //基于这个题目,这里的判断是必须的,因为根据题意,a到b可能有好几条路,而且路程允许相等,这个时候就要比较费用大小了
{
d[a][b]=d[b][a]=c;
fee[a][b]=fee[b][a]=e;//无向图,所以要a到b b到a都设置一下
}
if (d[a][b]==c&&fee[b][a]>e)
{
fee[b][a]=fee[a][b]=e;
}
}
int sta,end;
scanf("%d %d",&sta,&end);
dijst(sta,end);
printf("%d %d\n",distant[end],p[end]);//源点到任意点end的最短路径就保存在distant[]数组中,调用即可。
}
return ;
}
最短路——迪杰斯特拉算法 HDU_3790的更多相关文章
- HDU 2680 最短路 迪杰斯特拉算法 添加超级源点
Choose the best route Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- HUD 2544 最短路 迪杰斯特拉算法
最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- HDU 2544最短路 (迪杰斯特拉算法)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2544 最短路 Time Limit: 5000/1000 MS (Java/Others) Me ...
- 【算法杂谈】LJX的迪杰斯特拉算法报告
迪杰斯特拉(di jie qi)算法 这里有一张图: 假设要求从1号节点到5号节点的最短路.那么根据迪杰斯特拉算法的思想,我们先看: 节点1,从节点1出发的一共有3条路,分别是1-6.1-3.1-2. ...
- HDU6166-Senior Pan-Dijkstra迪杰斯特拉算法(添加超源点,超汇点)+二进制划分集合-2017多校Team09
学长好久之前讲的,本来好久好久之前就要写题解的,一直都没写,懒死_(:з」∠)_ Senior Pan Time Limit: 12000/6000 MS (Java/Others) Memor ...
- 最短路径之迪杰斯特拉算法的Java实现
Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法.该算法被称为是“贪心算法”的成功典范.本文接下来将尝试以最通俗的语言来介绍这个伟大的算法,并赋予java实现代码. 一.知识准备 ...
- C#迪杰斯特拉算法
C#迪杰斯特拉算法 网上有许多版本的,自己还是写一个理解点 Dijkstra.cs public class Dijkstra { private List<Node> _nodes; p ...
- C++迪杰斯特拉算法求最短路径
一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...
- C# 迪杰斯特拉算法 Dijkstra
什么也不想说,现在直接上封装的方法: using System; using System.Collections.Concurrent; using System.Collections.Gener ...
随机推荐
- mysql合并结果集
- 八十四、SAP中的ALV创建之三,创建ALV表格
一.销售表是2个表,一个抬头表,一个是销售内容表,数据库查询语句如下, 二.我们添加相关LAYOUT的格式控制如下 三.需要报每个字段都用相应的LAYOUT控制一下 四.点击模式,在模式里面,添加RE ...
- POJ 1177/HDU 1828 picture 线段树+离散化+扫描线 轮廓周长计算
求n个图矩形放下来,有的重合有些重合一部分有些没重合,求最后总的不规则图型的轮廓长度. 我的做法是对x进行一遍扫描线,再对y做一遍同样的扫描线,相加即可.因为最后的轮廓必定是由不重合的线段长度组成的, ...
- Hive 数据类型 + Hive sql
Hive 数据类型 + Hive sql 基本类型 整型 int tinyint (byte) smallint(short) bigint(long) 浮点型 float double 布尔 boo ...
- python之os.exec*族用法简结
os.exec*族主要用来代替当前进程,执行新的程序,不返回值.在UNIX上,新的执行程序加载到当前进程,与调用它的进程有相同的id. os.execl(path, arg0, arg1, ...) ...
- leetcode 正则表达式 (动态规划)
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符'*' 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的 ...
- ESP8266 SDK开发: 外设篇-串口
串口分布 串口切换说明 1.默认所有的数据都使用串口0输出 官方提供了函数可以选择printf利用哪一个串口输出 配置printf使用串口1打印输出,波特率115200 (注:这样配置对于调试程序很有 ...
- 小程序分享H5页面
1.在要分享的按钮上写一个跳转 <navigator url="../invite1/invite1"> <button class="invite_b ...
- C++的vector容器清空
c++内部STL库中自带了一个容器vetcor, 自带了清空方法——clear().但是clear使用之后,并不能清空数据,其数据再未被覆盖之前是不会改变的,个人猜测clear仅仅把指针挪动到了起始位 ...
- 解决RecyclerView瀑布流效果结合Glide使用时图片变形的问题
问题描述:使用Glide加载RecyclerView的Item中的图片,RecyclerView使用了瀑布流展示图片,但是滚动时图片会不断的加载,并且大小位置都会改变,造成显示错乱. 解决方法:使用瀑 ...