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的更多相关文章

  1. spring中controller

    提示:原网站已由百度转码,以便在移动设备上查看. 第七城市 (Portal 开发读书笔记)Spring Portlet MVC 测试Controller 2012-04-28 16:32:44 - - ...

  2. 数据结构与算法分析 - 最短路(Dijkstra+floyd_Warshall+bellman_ford)

    先附上Djikstra的代码:普通版 const int maxn=101; const int INF=0x3f3f3f3f; int edges[maxn][maxn]; int dist[max ...

  3. POJ-2387.Til the Cows Come Home.(五种方法:Dijkstra + Dijkstra堆优化 + Bellman-Ford + SPFA + Floyd-Warshall)

    昨天刚学习完最短路的算法,今天开始练题发现我是真的菜呀,居然能忘记邻接表是怎么写的,真的是菜的真实...... 为了弥补自己的菜,我决定这道题我就要用五种办法写出,并在Dijkstra算法堆优化中另外 ...

  4. 最短路 模板 【bellman-ford,dijkstra,floyd-warshall】

    Bellman-ford: /* bellman ford */ #include <iostream> #include <cstdio> #include <cstr ...

  5. Dijkstra 单源最短路径算法

    Dijkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家 Edsger Dijkstra 于 1956 年 ...

  6. 最短路径算法-Dijkstra

    Dijkstra是解决单源最短路径的一般方法,属于一种贪婪算法. 所谓单源最短路径是指在一个赋权有向图中,从某一点出发,到另一点的最短路径. 以python代码为例,实现Dijkstra算法 1.数据 ...

  7. [板子]最小费用最大流(Dijkstra增广)

    最小费用最大流板子,没有压行.利用重标号让边权非负,用Dijkstra进行增广,在理论和实际上都比SPFA增广快得多.教程略去.转载请随意. #include <cstdio> #incl ...

  8. POJ 2253 Frogger(Dijkstra)

    传送门 Frogger Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 39453   Accepted: 12691 Des ...

  9. POJ 2387 Til the Cows Come Home(最短路 Dijkstra/spfa)

    传送门 Til the Cows Come Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 46727   Acce ...

随机推荐

  1. [Go] panic 和 recover

    通常情况下,函数向其调用方报告错误的方式都是返回一个 error 类型的值.但是,当遇到致命错误的时候,很可能会使程序无法继续运行.这时,上述错误处理方式就太不适合了,Go 推荐通过调用 panic ...

  2. 【Go命令教程】2. go build

    go build 命令用于编译我们 指定的  源码文件 或 代码包 以及它们的依赖包. 例如,如果我们在执行 go build 命令时不后跟任何代码包,那么命令将试图编译当前目录所对应的代码包.例如, ...

  3. 项目内部IT/电商/信息化类简报,分享电子版

    除了一些国内不准发的内容,还有公司内部项目相关的.其他的大多数资料会在微信公众号推送,分享一下吧,希望大家也能推荐一些好文章. 微信公众号:WallinWind,原创IT类文章在CSDN博客也会同步更 ...

  4. SharePoint 2013 workflows stop working (Failed on started.)

    前言 最近,使用工作流的时候碰到了一个问题,突然间所有工作流都无法启动,报错Failed on started. 同时,工作流内部报错,工作流被系统账号取消了. 查了很久,发现系统打了windows ...

  5. 超能英雄第一至四季/全集Heroes迅雷下载

    本季第一.二.三.四季 Heroes Season (2006-2009) 看点:<Heroes>是NBC电视台于2006年九月开播的最新科幻电视剧.Heroes(中文剧名为“英雄”或“天 ...

  6. fabric-ca-server

    fabric-ca-server start -b admin:adminpw -d --db.type mysql --db.datasource "root:rootpwd@tcp(17 ...

  7. spring post 图片

    @RequestMapping(value = "/post",method = RequestMethod.POST) @ResponseBody String GPost(@R ...

  8. [Hook] 跨进程 Binder设计与实现 - 设计篇

    cp from : http://blog.csdn.net/universus/article/details/6211589 关键词 Binder Android IPC Linux 内核 驱动 ...

  9. Maven 快速入门

    安装 Maven是一个Java工具,因此你的电脑上必须安装有JAVA环境(JDK或者JRE) 首先,从官方下载 Maven ,我这里下载的是 3.5 的版本. 本文是在Mac环境中安装的,首先创建一个 ...

  10. Python获取数字的二进制值

    目标 想要获取一个整形数字的二进制表示 bin 内置函数 看一下官方的解释 Convert an integer number to a binary string prefixed with &qu ...