最短路——迪杰斯特拉算法 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 ...
随机推荐
- 040、Java中逻辑运算之短路与运算“&&”
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- SpringBoot-配置Java方式
SpringBoot中使用Java方式配置步骤如下: 在类上加入@Configuration注解,代表作为配置类 在该类方法上加入@Bean注解,代表将方法返回的Bean加入Spring容器 在该类中 ...
- JAVA实现--基础算法FOR选择排序
首先 实现简单的选择排序. 简单排序的思路很简单,就是通过遍历(数组的length次)的数组,每次遍历找出最小的放到数组的第一个位置,下次遍历时就不用考虑第0位置的数从第1的位置开始找1到length ...
- 吴裕雄--天生自然java开发常用类库学习笔记:正则表达式
public class RegexDemo01{ public static void main(String args[]){ String str = "1234567890" ...
- 软件包管理:RPM包管理-yum在线管理
CentOS 是免费的的 RedHat需要付费 1.IP地址配置 setup #使用setup工具 (这种方式配置的永久有效 同时还可以配置掩码 网关等) 直接输入setup就会弹出(注意的是该命令 ...
- Kafka--windows下简单使用kafka命令
参考 https://www.cnblogs.com/cici20166/p/9426417.html 启动zookeeper 只需要保证有可用的zookeeper,可以使用kafka内置的,也可以自 ...
- node - TypeError: argument handler must be a function 路由报错的原因
原因 : 路由一定要暴露给外部使用 var express = require('express') var router = express.Router() router.get('/', ...
- 六十七、SAP中内表插入的三种方法之一,APPEND的使用
一.如果内表是一个普通的内表,只用于存储数据不用来排序,那么优先选择APPEND插入 二.我们运行程序,并把工作区和内表加入到断点变量,如图所示,1X22的意思如图 三.我们点击ITAB1,来看内表数 ...
- 【BZOJ2400】Optimal Marks
题意 定义无向图中的一条边的值为:这条边连接的两个点的值的异或值. 定义一个无向图的值为:这个无向图所有边的值的和. 给你一个有 \(n\) 个结点 \(m\) 条边的无向图.其中的一些点的值是给定的 ...
- junit基础学习之-junit3和4的区别(4)
junit3和junit4的使用区别如下 1.在JUnit3中需要继承TestCase类,但在JUnit4中已经不需要继承TestCase 2.在JUnit3中需要覆盖TestCase中的setUp和 ...