最短路——迪杰斯特拉算法 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 ...
随机推荐
- 015、Java中定义变量时不设置内容,使用变量前设置内容
01.代码如下 package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- 01.Delphi最简单的接口
我想学习一个插件框架,但是那个框架里面大量用到了接口,于是不得不把接口看一下了.总感觉接口编程这一块非常的绕,每一行都注释了. unit Unit1; interface uses Windows, ...
- List<Object> 查询解析优化
2018年3月16日 大型仪器设备分类查出后,需要展示个分类下总共有多少台设备.因为分类总共分三层,加起来数据700+.以后该系统上线设备可能达到2000+,这样统计每个分类下的设备可能会拖垮服务器. ...
- gerrit 版本下载
链接:https://gerrit-releases.storage.googleapis.com 如下载gerrit-2.12.2.war https://gerrit-releases.stora ...
- Oracle 新建用户、赋予权限
1.新建用户 新建用户: create User username Identified by password 修改用户密码: alter User username Identified by p ...
- 虚拟机安装centos6.5出现Error processing drive:pci-0000:00:10-scsi-0:0:0:0问题
vmware安装linux系统出现Error processing drive:pci-0000:00:10-scsi-0:0:0:0问题 问题出现原因:我给虚拟机的内存太小了,只给了512M 解决办 ...
- 五十二、SAP中的可编辑表格LVC
一.之前我们写的表格如下,都是通过WRITE输出,不支持同步编辑等操作,给人感觉非常之LOW 二.在SAP中还存在另外一种可编辑的表格,叫LVC表格,效果如下, 三.此可标记表格是座位SAP内置模块来 ...
- Git提交出现error: src refspec master does not match any的问题
在本地与远程分别新建了一个仓库并且关联后,想要把本地的文件提交到github上面, 输入下方命令后没有成功,而是出现了报错:error: src refspec master does not mat ...
- js(JavaScript)使用${pageContext.request.contextPath}报错
前几天写程序在js文件中用到了${pageContext.request.contextPath}然后一直报错,没有办法post到服务器,原来js把这个当成字符串了,一直以为他是jquery的函数! ...
- 箭头函数arrow funtion
1.定义一个匿名函数常规语法: function (x) { return x * x; } 2.该函数使用箭头函数可以使用仅仅一行代码搞定! x => x * x 箭头函数相当于匿名函数,并且 ...