最短路——迪杰斯特拉算法 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 ...
随机推荐
- DateTimePicker控件在WinXP下的BUG
如图,通过图示的按钮改变datetimepicker的值 ,弹出MessageBox, datetimePicker重新获得焦点后,自动重复点击按钮. 解决办法: new Thread(() => ...
- leetcode922 Sort Array By Parity II
""" Given an array A of non-negative integers, half of the integers in A are odd, and ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-fast-forward
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- 关于VMware vSphere Client安装时,.net framework4进度条卡住不动(亲测)
亲测有用的办法 1.点击电脑桌面右下角的"开始"按钮,点击"运行"按钮,在弹出的节目输入框中输入"regedit". 2.在弹出来的&quo ...
- Spring入门之四-------SpringIoC之其他知识点
一.懒加载 public class Bean1 { public Bean1() { System.out.println(this.getClass().getSimpleName() + &qu ...
- js排序专场
1,冒泡排序 function bubble(arr) { var len = arr.length - 1; for (let i = 0 ; i < len; i++) { var bool ...
- Struts+Hibernate+Spring面试题合集及答案(转)
Struts+Hibernate+Spring面试题合集及答案 Struts+Hibernate+Spring 面试题合集 1 1. Hibernate部分 2 1.1. Hibernate工作原理 ...
- tf.argmax()函数作用
tf.argmax()函数原型: def argmax(input, axis=None, name=None, dimension=None, output_type=dtypes.int64) 作 ...
- 069-PHP数组下标
<?php $arr=array(98,'hello',67,'A',85,NULL); //定义一个数组 $x=0; //定义三个作为下标的变量 $y=3; $z=5; echo " ...
- OleDbCommand 的用法
OleDbCommand 的用法 OleDbConnection con=new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; dat ...