经典问题----最短路径(Floyd弗洛伊德算法)(HDU2066)
问题简介:
给定T条路,S个起点,D个终点,求最短的起点到终点的距离。
思路简介:
弗洛伊德算法即先以a作为中转点,再以a、b作为中转点,直到所有的点都做过中转点,求得所有点到其他点的最短路径,Floyd算法适用于多源最短路径,是一种动态规划算法,稠密图效果最佳,边权可正可负。优点:容易理解,可以算出任意两个节点之间的最短距离,代码编写简单。缺点:时间复杂度比较高,不适合计算大量数据。Floyd算法时间复杂度为n^3,Dijikstra算法为n^2。
优化代码:
#include <iostream>
#include <cmath>
#include <stdio.h>
#include <cstdio>
#include <cstring>
#include<algorithm>
#include<time.h>
#include<math.h>
#include <stdlib.h>
#include <string.h>
#include <stack> using namespace std; #define MAXN 1000000
#define N 1010
int map[N][N], s[N], e[N], maxx;
int T, S, D;
int floyd()
{
int res = MAXN;
for (int k = ; k <= maxx; k++)
for (int i = ; i <= maxx; i++)
if (map[i][k] != MAXN)//优化
for (int j = ; j <= maxx; j++)
{
if (map[i][j]>map[i][k] + map[k][j])
map[i][j] = map[i][k] + map[k][j];
if (s[i] && e[j] && res>map[i][j])//因为是取最短的一条路径,所以随时记录起点到终点的路
res = map[i][j];
}
return res;
}
int main()
{
while (scanf("%d%d%d", &T, &S, &D) != EOF)
{
memset(map, , sizeof(map));
memset(s, , sizeof(s));
memset(e, , sizeof(e));
for (int i = ; i <= ; i++)//初始化
for (int j = ; j <= ; j++)
map[i][j] = MAXN;
int u, v, w;
for (int i = ; i <= T; i++)
{
scanf("%d%d%d", &u, &v, &w);
maxx = max(maxx, max(u, v));
map[u][v] = w;
}
for (int i = ; i <= S; i++)
{
scanf("%d", &u);
s[u] = ;//起点
}
for (int i = ; i <= D; i++)
{
scanf("%d", &u);
e[u] = ;//终点
}
printf("%d\n", floyd());
}
return ;
}
经典问题----最短路径(Floyd弗洛伊德算法)(HDU2066)的更多相关文章
- Floyd(弗洛伊德)算法(C语言)
转载:https://blog.csdn.net/qq_35644234/article/details/60875818 Floyd算法的介绍 算法的特点 弗洛伊德算法是解决任意两点间的最短路径的一 ...
- Floyd弗洛伊德算法
先看懂如何使用 用Java实现一个地铁票价计算程序 String station = "A1 A2 A3 A4 A5 A6 A7 A8 A9 T1 A10 A11 A12 A13 T2 A1 ...
- JS实现最短路径之弗洛伊德(Floyd)算法
弗洛伊德算法是实现最小生成树的一个很精妙的算法,也是求所有顶点至所有顶点的最短路径问题的不二之选.时间复杂度为O(n3),n为顶点数. 精妙之处在于:一个二重初始化,加一个三重循环权值修正,完成了所有 ...
- Floyd算法(弗洛伊德算法)
算法描述: Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法.从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按 ...
- 弗洛伊德算法(Floyd算法)
原博来自http://www.cnblogs.com/skywang12345/ 弗洛伊德算法介绍 和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的 ...
- [从今天开始修炼数据结构]图的最短路径 —— 迪杰斯特拉算法和弗洛伊德算法的详解与Java实现
在网图和非网图中,最短路径的含义不同.非网图中边上没有权值,所谓的最短路径,其实就是两顶点之间经过的边数最少的路径:而对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,我们称路径上第 ...
- 弗洛伊德算法(Floyd )
package com.rao.graph; /** * @author Srao * @className Floyd * @date 2019/12/11 18:43 * @package com ...
- 单源最短路径Dijkstra算法,多源最短路径Floyd算法
1.单源最短路径 (1)无权图的单源最短路径 /*无权单源最短路径*/ void UnWeighted(LGraph Graph, Vertex S) { std::queue<Vertex&g ...
- 弗洛伊德算法Floyed(求各顶点间最短路径):可打印最短路径
#include <iostream> #include <string> #include <iomanip> using namespace std; #def ...
随机推荐
- Python之路【目录】
https://www.cnblogs.com/wupeiqi/articles/4938499.html
- phpstrom mac 快捷键
对应键 ⌘——Command ⌃ ——Control ⌥——Option/Alt ⇧——Shift ⇪——Caps Lock fn——功能键就是fn 编辑 Command+alt+T 用 (if..e ...
- 【leetcode198 解题思路】动态规划
动态规划 https://blog.csdn.net/so_geili/article/details/53639920 最长公共子序列 https://blog.csdn.net/so_geili/ ...
- 非node环境下的vue.js 实现简单的购物车计算功能 样式请无视
都说vue的双向数据绑定好用,自己用了下,感觉做购物车没想象中好用.自己的实现如下: <!DOCTYPE html> <html lang="en"> &l ...
- 利用postman 实现Get和Post测试
通过之前对金字塔结构的学习,大概了解到了金字塔模型想告诉我们的几个道理: 1.越底层,越稳定. 金字塔主要观点认为单元测试的稳定性高,需要多投入. 2.越底层,越高效. 程序的问题,最终还得落在具体的 ...
- Qt的子窗口和父窗口阻塞问题
在图形界面中,软件设计者通常需要将活跃窗口限制为一个.在某个窗口活跃时,它的父窗口被它挡住或者挡住一部分,这时候用鼠标去点击父窗口是没有作用的.问题的关键在于将子窗口设置模态: void MainWi ...
- mssqlserver超级班助类 带详细用法
using System; using System.Collections; using System.Collections.Generic; using System.Configuration ...
- 使用TkbmMWThreadList实现线程安全列表
2008年的2.90.00版本,作者实现了TkbmMWThreadList,之后在kbmMW 4.40.00版本,作者将TkbmMWThreadList改成了泛型版本,用以实现线程安全的列表.要使用T ...
- BUAAOO P5-P7 Elevator Simulation
目录 Abstract Introduction Topic Request Elevator Analysis Reading Requests Coordinating Scheduling an ...
- mysql5.5.28在Linux下的安装
1. 下载mysql 在http://dev.mysql.com/downloads/mysql/ 官网上下载mysql-5.5.28-linux2.6-i686.tar.gz. 2. ...