最短路径(最基础,经典的模板和思想):HDU-2544最短路
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 65437 Accepted Submission(s): 28608
Problem Description
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
Input
输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
输入保证至少存在1条商店到赛场的路线。
Output
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
Sample Input
2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0
Sample Output
3
2
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100+10;
const int Max = 99999999;
int d[1000010];
int maps[maxn][maxn];
int n,m;
bool use[maxn];//用于标记,避免循环走 void Ds()
{
while(1)
{
int v = -1;//记录最近的点
for(int i=1;i<=n;i++)
if((v == -1 || d[i]<d[v]) && !use[i])
v = i;
if(v == -1)
break;
use[v] = 1;
for(int i=1;i<=n;i++)
d[i] = min(d[i],d[v]+maps[i][v]);//d[v] + maps[i][v],记录从起点到i的距离
}
}
int main()
{
//printf("%d",Max);
while(scanf("%d%d",&n,&m) && n+m)
{
for(int i=0;i<maxn;i++)
for(int j=0;j<maxn;j++)
maps[i][j] = Max;//初始化为最大
memset(use,0,sizeof(use));
for(int i=0;i<=m*n+10;i++)
d[i] = Max;//初始化为最大
for(int i=0;i<m;i++)
{
int start,end;
int len;
d[1] = 0;//自身走到自身是0,起点初始化为零,如果有多个起点就直接将多个起点全部初始化为0
scanf("%d%d%d",&start,&end,&len);
maps[start][end] = maps[end][start] = len;//是双向的并 没有固定方向
}
Ds();
printf("%d\n",d[n]);
}
}
解题心得:
1、Floyd算法其实就是一个动态规划,他的基本思想就是将一个点到另一个点的走法分为两个,第一,从i点走到j点可以直接从i走到j,第二,从i点走到j点可以先从i点走到k点再从k点走到j点,比较这两种走法哪一种更加的优秀就可以了,然后动态规划,从i点到i+1点,一直达到n点。
2、Floyd的时间复杂度是O(n^3),空间复杂度是O(n^2)。
3、很尴尬的是使用了几次这个算法,但是都超时了,时间复杂度是O(n^3),这一点一定要注意,使用之前一定要先计算一下时间的复杂度
#include<bits/stdc++.h>
using namespace std;
int n,m;
const int maxn = 110;
const int INF = 0x3f3f3f3f;
int maps[maxn][maxn]; void pre_maps()
{
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
maps[i][j] = INF;
while(m--)
{
int a,b,len;
scanf("%d%d%d",&a,&b,&len);
if(len < maps[a][b])
maps[a][b] = maps[b][a] = len;
}
} void Floyd()
{
for(int k=1; k<=n; k++)
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
if(maps[i][j] > maps[i][k] + maps[k][j])//在这里k作为中间的转接
maps[i][j] = maps[i][k] + maps[k][j];
} int main()
{
while(scanf("%d%d",&n,&m) && (n+m))
{
pre_maps();
Floyd();
printf("%d\n",maps[1][n]);
}
return 0;
}
最短路径(最基础,经典的模板和思想):HDU-2544最短路的更多相关文章
- HDU 2544 最短路(模板题)
求1到N的最短路径,模板题,以1为源点,用dijkstra算法(可以用优先级队列优化) #include <iostream> #include <algorithm> #in ...
- hdu 2544 最短路 (最短路径)
最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- 【hdu 2544最短路】【Dijkstra算法模板题】
Dijkstra算法 分析 Dijkstra算法适用于边权为正的情况.它可用于计算正权图上的单源最短路( Single-Source Shortest Paths, SSSP) , 即从单个源点出发, ...
- HDU 2544 最短路(模板题——Floyd算法)
题目: 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你 ...
- hdu 2544 最短路(两点间最短路径)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2544 方法一:dijkstra算法,求两点之间最短路径. /*********************** ...
- HDU 2544 最短路 【Dijkstra模板题】
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2544 思路:最短路的模板题 Dijkstra 算法是一种类似于贪心的算法,步骤如下: 1.当到一个点时, ...
- HDU 2544 最短路 SPFA 邻接表 模板
Problem Description 在每年的校赛里,全部进入决赛的同学都会获得一件非常美丽的t-shirt.可是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以如今他们想 ...
- HDU 2544 - 最短路 - [堆优化dijkstra][最短路模板题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 Time Limit: 5000/1000 MS (Java/Others) Memory Li ...
- HDU 2544最短路dijkstra模板题
最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
随机推荐
- Python list, dict, set, tuple
list方法 append: 添加一个新的元素到末尾 extend: 扩展元素 insert: 在任何位置插入元素 pop: 弹出末尾的元素 remove: remove first occurren ...
- js中快速的访问某个url
在做项目中经常会遇到这样的需求,自动向后台发送统计日志,也不需要关心返回值,当然了方法有很多,其中一个方法就是使用Ajax. 在这里我要介绍的方法的原理是使用图片,给这个图片符url,这样就会自动的触 ...
- 解决在eclipse中导入项目名称已存在的有关问题
新建项目-Import-File System-找到相应的文件夹-Overwrite existing resources without warning打钩,选中项目即可
- Linux常用操作2
第1章 find命令扩展 转自:https://www.cnblogs.com/clsn/p/7520333.html 1.1 方法一 |xargs 通过|xargs将前面命令的执行结果传给后面. [ ...
- 洛谷P1397 [NOI2013]矩阵游戏(十进制矩阵快速幂)
题意 题目链接 Sol 感觉做这题只要对矩阵乘法理解的稍微一点就能做出来对于每一行构造一个矩阵A = a 1 0 b列与列之间的矩阵为B = c 1 0 d最终答案为$A^{n - ...
- jQuery_3_过滤选择器
过滤选择器(过滤器)类似于CSS3里的伪类,包含 1. 基本过滤器 2. 内容过滤器 3. 可见性过滤器 4. 子元素过滤器 5. 其他方法 一. 基本过滤器 过滤器名 jQuery语法 注释 :f ...
- 关于Windows创建进程的过程
之前有听到别人的面试题是问系统创建进程的具体过程是什么,首先想到的是CreateProcess,但是对于具体过程却不是很清楚,今天整理一下. 从操作系统的角度来说 创建进程步骤: 1.申 ...
- Android(java)学习笔记86:Android提供打开各种文件的API接口:setDataAndType
1. Android 打开各种文件(setDataAndType) private void openFile(File file){ Intent intent = new Intent(); in ...
- SQLSERVER存储过程的基本语法实例
SQLSERVER存储过程的基本语法实例 SQLSERVER存储过程的基本语法实例 一.定义变量--简单赋值 declare @a intset @a=5 print @a --使用select语句赋 ...
- 问题010:在Java中,什么是常量,什么是变量?
Java中常量如何分类? 1.整数常量,所有的整数. 整数又分为 int (integer) 占用4个字节 一个字节占几个二进制位?8个二进制位,一个整型变量占32位二进制位 (内存中开辟出来的存储空 ...