Dijkstra和Floyd_warshall
import java.util.Arrays;
import java.util.Scanner; /*题目描写叙述:
有n个城市。城市间有m条道路。每条道路都有长度d。给你起点城市s终点终点t。要求输出起点到终点的最短距离
输入:
输入n,m。城市的编号是1~n,然后是m行。每行3个数 a,b,d,表示a城市和b城市之间有一条道路。且其长度为d。如果a与b之间若有道路。则仅仅 有一条道路。最后一行是两个数 s,t;起点s,终点t。n和m为0时输入结束。(1<n<=1000, 0<m<100000, s != t)
输出:
输出一行有一个数, 表示最短距离。
例子输入:
3 2
1 2 5
2 3 4
1 3
0 0
例子输出:
9*/ /*
* 起点s,终点t
* map[a][b]表示a点与b点直接连通的距离,没有直接连通则为无限大
* d[i]表示s点到i点的距离
* fa[i]表示i点是否已经更新过了最短距离,true表示没有被使用,false表示已经被使用
*
* 大致步骤例如以下:
* 1.先从d数组里找到一个离起点近期的点k,并且fa[k]必须为true,距离为d[k]
* 2.将fa[k]赋值为false。接下来将用k来更新最短距离
* 3.随意一点j,且fa[j]为false。若d[k] + map[k][j]比d[j]小则将d[k] + map[k][j]赋值给d[j]
* 换句话说就是先从起点走到k点(d[k])。再从k点走到j(map[k][j]),若比从起点
* 到j的距离(d[j])短。则d[j]应该变为d[k] + map[k][j]
* 4.回到步骤1,直到全部fa数组里全部点都为false。
* 5.d[t]就是起点s到终点t的最短距离
*/
public class Dijkstra { public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
int m = cin.nextInt();
while (n != 0 && m != 0) {
int[][] map = new int[n + 5][n + 5];
for (int i = 0; i < map.length; i++) {
// 将map随意两点的初值设置一个非常大的值,表示两点间的距离无限大,即没有通路
// 除以3是由于后面有加的地方,我害怕两个值加会超过Integer.MAX_VALUE
Arrays.fill(map[i], Integer.MAX_VALUE / 3);
}
for (int i = 1; i <= m; i++) {
int a = cin.nextInt();
int b = cin.nextInt();
int c = cin.nextInt();
// a点到b点的距离是c
map[a][b] = c;// a到b的距离赋为c
map[b][a] = c;// b到a的距离赋为c
}
int s = cin.nextInt();// 起点
int t = cin.nextInt();// 终点
// d数组:d[i]表示起点s到i点的最短距离
int[] d = new int[n + 5];
Arrays.fill(d, Integer.MAX_VALUE);
// fa数组:fa[i]表示i点是否已经更新过了最短距离,true表示没有被使用,false表示已经被使用
boolean[] fa = new boolean[n + 5];
Arrays.fill(fa, true);// 初始值都为true,表示全部点都能够用
fa[s] = false;// 起点不能更新自己,所以为false
for (int i = 1; i <= n; i++) {
d[i] = map[s][i];// d[i]的为题目给出的map[s][i]
}
// 将全部点的fa的值都变为false,由于s点已经为false。所以我这里写i<n而不是i<=n
for (int i = 1; i < n; i++) {
int min = Integer.MAX_VALUE;
int k = 0;
for (int j = 1; j <= n; j++) {
if (fa[j] && min > d[j]) {
min = d[j];// 找到一个最小的d[j]
k = j;// 并记录下标为k } }
fa[k] = false;// 这样接下来就不会出现d[k] + map[k][k]的情况了,k点在i添加时被抛弃
for (int j = 1; j <= n; j++) {
// if(j点可用 && 当前起点s到k的最短距离+k到j直接连通的距离<当前起点s到j的最短距离)
if (fa[j] && d[k] + map[k][j] < d[j]) {
d[j] = d[k] + map[k][j];// 找到了更优的s到j的最短距离
}
} }
System.out.println(d[t]);// 整个过程之后d[t]就是s到t的最短距离了 n = cin.nextInt();
m = cin.nextInt();
} } }
import java.util.Arrays;
import java.util.Scanner;
/*题目描写叙述和那道Dijkstra的题一样,只是这个时间复杂度是O(n^3),
假设和上一道题一样。n要是最多1000的话。这个算法就会超时
看完了这个算法能够看看九度1447。分别用这两种算法都做一下
这里有一篇别人写的博客能够參考一下:http://blog.csdn.net/jdplus/article/details/19816375
*/ /*
* 起点s。终点t
* map[a][b]表示a点与b点直接连通的距离。没有直接连通则为无限大
* 这个代码非常easy大致思路:
* 分别把全部节点都当做媒介节点
*/
public class Floyd_warshall{ public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
int m = cin.nextInt();
while (n != 0 && m != 0) {
int[][] map = new int[n + 5][n + 5];
for (int i = 0; i < n + 5; i++){
//和Dijkstra的算法一样我害怕会超过范围就除以了3
Arrays.fill(map[i], Integer.MAX_VALUE / 3);
}
for (int i = 1; i <= m; i++) {
int a = cin.nextInt();
int b = cin.nextInt();
int c = cin.nextInt();
map[a][b] = c;
map[b][a] = c;
}
//这个代码非常easy,以下两段切割线之间就是最核心的代码
//----------------------------------
for (int k = 1; k <= n; k++)//k为媒介节点
for (int i = 1; i <= n; i++)//i为全部的起点
for (int j = 1; j <= n; j++)//j为全部的终点
/*
* 以下是最关键的两句:
* 假设i到k的距离加上k到j的距离比i到j的距离小,
* 则更新map[i][j]为map[i][k] + map[k][j]
* 就是不断把k当做中间节点来更新其它的两点的距离
*/
if (map[i][k] + map[k][j] < map[i][j]) {//假设i到k的距离加上k到j的距离比i到j的距离小
map[i][j] = map[i][k] + map[k][j];//更新map[i][j]
}
//----------------------------------
int s = cin.nextInt();
int t = cin.nextInt();
System.out.println(map[s][t]);//更新后的map[s][t]已经是s到t的最短里的 n = cin.nextInt();
m = cin.nextInt();
} } }
九度1447能够两种方法都能够,九度1008仅仅能用第一种方法
Dijkstra和Floyd_warshall的更多相关文章
- spring中controller
提示:原网站已由百度转码,以便在移动设备上查看. 第七城市 (Portal 开发读书笔记)Spring Portlet MVC 测试Controller 2012-04-28 16:32:44 - - ...
- 数据结构与算法分析 - 最短路(Dijkstra+floyd_Warshall+bellman_ford)
先附上Djikstra的代码:普通版 const int maxn=101; const int INF=0x3f3f3f3f; int edges[maxn][maxn]; int dist[max ...
- POJ-2387.Til the Cows Come Home.(五种方法:Dijkstra + Dijkstra堆优化 + Bellman-Ford + SPFA + Floyd-Warshall)
昨天刚学习完最短路的算法,今天开始练题发现我是真的菜呀,居然能忘记邻接表是怎么写的,真的是菜的真实...... 为了弥补自己的菜,我决定这道题我就要用五种办法写出,并在Dijkstra算法堆优化中另外 ...
- 最短路 模板 【bellman-ford,dijkstra,floyd-warshall】
Bellman-ford: /* bellman ford */ #include <iostream> #include <cstdio> #include <cstr ...
- Dijkstra 单源最短路径算法
Dijkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家 Edsger Dijkstra 于 1956 年 ...
- 最短路径算法-Dijkstra
Dijkstra是解决单源最短路径的一般方法,属于一种贪婪算法. 所谓单源最短路径是指在一个赋权有向图中,从某一点出发,到另一点的最短路径. 以python代码为例,实现Dijkstra算法 1.数据 ...
- [板子]最小费用最大流(Dijkstra增广)
最小费用最大流板子,没有压行.利用重标号让边权非负,用Dijkstra进行增广,在理论和实际上都比SPFA增广快得多.教程略去.转载请随意. #include <cstdio> #incl ...
- POJ 2253 Frogger(Dijkstra)
传送门 Frogger Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 39453 Accepted: 12691 Des ...
- POJ 2387 Til the Cows Come Home(最短路 Dijkstra/spfa)
传送门 Til the Cows Come Home Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 46727 Acce ...
随机推荐
- STM32输入捕获模式设置并用DMA接收数据
参考: STM32的PWM输入模式设置并用DMA接收数据 Input capture mode The input stage samples the corresponding TIx input ...
- JS删除String里某个字符的方法
关于JS删除String里的字符的方法,一般使用replace()方法.但是这个方法只会删除一次,如果需要将string里的所以字符都删除就要用到正则. 1 2 3 4 var str = " ...
- Lodop客户端本地和集中打印 [是否安装][操作系统]
前面有些博文或图片介绍了这两种方式,可能文字太多,耐心看完的人不多,这里简略描述+图片的方式解释一下. 客户端本地打印: 用户访问某网站,用自己本地的打印机打出来. 集中打印方式: 用户访问某网页,用 ...
- Git 代码更新:git fetch 和 git pull 的区别
Git 从远程的分支获取最新的版本到本地有这样 2 个命令: 1. git fetch:相当于是从远程获取最新版本到本地,但不会自动 merge git fetch origin master git ...
- [vs2013]远程服务器调试
摘要 有时遇到比较奇葩的问题,比如本地程序正常运行,在服务器上不可以,如果日志也不起作用,那么远程调试就非常必要了,在服务器上安装vs,是比较费力费时的. 步骤 1.找到vs安装目录,一般默认安装在c ...
- Delphi处理Android的路径信息
路径操作就使用TPath的方法都很方便.usesSystem.IoUtilsTPath.GetTempPath//临时目录TPath.GetCameraPath//照相机目录(照片/录像)TPath. ...
- Windows Phone本地数据库(SQLCE):14、删除数据(翻译)
这是“windows phone mango本地数据库(sqlce)”系列短片文章的最后一篇第十四篇. 为了让你开始在Windows Phone Mango中使用数据库,这一系列短片文章将覆盖所有你需 ...
- iOS App与iTunes文件传输的方法和对iOS App文件结构的说明
转:http://www.xiaoyaoli.com/?p=368 就像很多iOS上面的播放器App一样,本文编写一个程序可以通过iTunes往里面放文件,比如编写一个音乐播放器程序,通过itune往 ...
- C#编程(四十一)----------用户定义的数据类型转换
用户定义的数据类型转换 C#允许定义自己的 数据类型,这意味着需要某些 工具支持在自己的数据类型间进行数据转换.方法是把数据类型转换定义为相关类的一个成员运算符,数据类型转换必须声明为隐式或者显式,以 ...
- JAVA8 List排序
先定义一个实体类 @Data @AllArgsConstructor @NoArgsConstructor public class Human { private String name; priv ...