P1359 租用游艇   原题链接https://www.luogu.org/problemnew/show/P1359

P3905 道路重建   原题链接https://www.luogu.org/problemnew/show/P3905

这两道题我觉得都是Floyd算法的应用,所以我就放在一块来写了,毕竟A这两道题的时间间隔比较短;

P1359 租用游艇

对于这个题,一开始被这个半矩阵惊到了-------主要是不知道这个矩阵是什么意思,过了好长时间(2min)才明白是到其他游艇的距离。

我们去理解一下输入:

输入半矩阵的代码:

    for(int i=;i<n;i++)
{
for(int j=i+;j<=n;j++)
{
f[i][j]=read(); //从游艇i到游艇j的距离
}
}

然后我们要求的就是游艇1到游艇n的距离,也就是f[1][n],这里我们用Floyd算法就能轻松AC;

注意一个小细节:

题目中说:游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。

这句话其实是说:游艇只会顺流而下,不会逆流而上!所以我们要特判一下,如果我们枚举的中间点k<=i,直接continue;

OK上代码:

#include<iostream>
#include<cstdio>
using namespace std;
int read()
{
char ch=getchar();
int a=,x=;
while(ch<''||ch>'')
{
if(ch=='-') x=-x;
ch=getchar();
}
while(ch>=''&&ch<='')
{
a=(a<<)+(a<<)+(ch-'');
ch=getchar();
}
return a*x;
}
int n;
int f[][];
int main()
{
n=read();
for(int i=;i<n;i++)
{
for(int j=i+;j<=n;j++)
{
f[i][j]=read(); //从i到j的距离
}
}
for(int k=;k<=n;k++) //Floyd算法
{
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
if(k<=i) continue; //如果枚举的中间点k在游艇i的上游,直接跳出
if(f[i][j]>f[i][k]+f[k][j])
f[i][j]=f[i][k]+f[k][j];
}
}
}
cout<<f[][n]; //最后的答案
return ;
}

P3905 道路重建

这个题其实不是很难,只是思路有些难想,我也是看了题解之后才想出来的:

这个题要你求从A到B要修的最短道路,也就是说那些没有被炸毁的道路我们不用修,我们可以将这些道路的权值赋为0,这样Floyd算法求出的最短路就是要修的最短道路,看代码:

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int read() //读入优化
{
char ch=getchar();
int a=,x=;
while(ch<''||ch>'')
{
if(ch=='-') x=-x;
ch=getchar();
}
while(ch>=''&&ch<='')
{
a=(a<<)+(a<<)+(ch-'');
ch=getchar();
}
return a*x;
}
int n,m,d,f[][],vis[][]; //f数组存图,vis数组存哪条路被炸了
int main()
{
n=read();m=read();
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
f[i][j]=1e9,vis[i][j]=; //初始化
for(int i=;i<=m;i++)
{
int u=read();
int v=read();
int w=read();
f[u][v]=w; //注意建双向图
f[v][u]=w;
}
d=read();
for(int i=;i<=d;i++)
{
int u=read();
int v=read();
vis[u][v]=; //表示u到v这条路被炸了
vis[v][u]=;
}
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(vis[i][j]==&&f[i][j]<1e9) //如果这条路没被炸,并且连通,那么将权值设为0
f[i][j]=;
int s=read();
int end=read();
for(int k=;k<=n;k++) //Floyd算法模板
{
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
if(f[i][k]+f[k][j]<f[i][j])
f[i][j]=f[i][k]+f[k][j];
}
}
}
cout<<f[s][end]; //起点到终点的最短修的道路
return ;
}

P1359 租用游艇 && P3905 道路重建 ------Floyd算法的更多相关文章

  1. 洛谷——P3905 道路重建

    P3905 道路重建 题目描述 从前,在一个王国中,在n个城市间有m条道路连接,而且任意两个城市之间至多有一条道路直接相连.在经过一次严重的战争之后,有d条道路被破坏了.国王想要修复国家的道路系统,现 ...

  2. P3905 道路重建

    P3905 道路重建我一开始想错了,我的是类似kruskal,把毁坏的边从小到大加,并且判断联通性.但是这有一个问题,你可能会多加,就是这条边没用,但是它比较小,你也加上了.居然还有10分,数据也是水 ...

  3. 洛谷 P3905 道路重建 题解

    P3905 道路重建 题目描述 从前,在一个王国中,在\(n\)个城市间有\(m\)条道路连接,而且任意两个城市之间至多有一条道路直接相连.在经过一次严重的战争之后,有\(d\)条道路被破坏了.国王想 ...

  4. 洛谷 P1359 租用游艇【dp】(经典)

    题目链接:https://www.luogu.org/problemnew/show/P1359 题目描述 长江游艇俱乐部在长江上设置了n 个游艇出租站1,2,…,n.游客可在这些游艇出租站租用游艇, ...

  5. P1359 租用游艇 洛谷

    https://www.luogu.org/problem/show?pid=1359 题目描述 长江游艇俱乐部在长江上设置了n 个游艇出租站1,2,…,n.游客可在这些游艇出租站租用游艇,并在下游的 ...

  6. 洛谷 P1359 租用游艇

    题目描述 长江游艇俱乐部在长江上设置了n 个游艇出租站1,2,-,n.游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇.游艇出租站i 到游艇出租站j 之间的租金为r(i,j),1& ...

  7. P1359 租用游艇

    题目描述 长江游艇俱乐部在长江上设置了n 个游艇出租站1,2,…,n.游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇.游艇出租站i 到游艇出租站j 之间的租金为r(i,j),1& ...

  8. 洛谷P1119-灾后重建-floyd算法

    洛谷P1119-灾后重建 题目描述 给出\(B\)地区的村庄数NN,村庄编号从\(0\)到\(N-1\),和所有\(M\)条公路的长度,公路是双向的. 给出第\(i\)个村庄重建完成的时间\(t_i\ ...

  9. 洛谷P3905 道路重建

    题目:https://www.luogu.org/problemnew/show/P3905 分析: 此题是显然的最短路算法,只是看到一起删掉的一堆边感到十分棘手,而且还要求出的是最短添加边的总长度 ...

随机推荐

  1. Windows一键设置环境变量(以设置java环境变量为例)

    右击以管理员方式运行 JDKSetting.bat   @echo off color 0a echo.------------------------------------ echo.TODO:设 ...

  2. glang flag

    package main import ( "flag" "fmt" "github.com/golang/glog" ) /* 解析 fl ...

  3. 在javascript对象内搜索,貌似是一个新鲜的话题。

    为啥 也不为啥,因为没找到. 用途 也没啥用途,比如,在电影网站找到链接,在小说网站找到链接.二货同事写的复杂对象.等等吧.反正要搜索就对了. 目标 在对象内,无论多少层,找到关键字. 关键字可能的位 ...

  4. USB相关资料汇总

    [1]USB规范,一切的一切,基本的基本,天书级别USB_11_spec(中文).pdf    USB1.1规范(中文版) usb_20.pdf                     USB2.0规 ...

  5. SvcUtil.exe工具生成客户端代理类

    1.以管理员身份运行vs下命令工具: 2.运行代码示例:C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin>svcutil http: ...

  6. 如何对Nginx日志文件进行切割保存

    日积月累下,日志文件会越来越大,日志文件太大严重影响服务器效率,须要定时对日志文件进行切割. 切割的方式有按月切割.按天切割.按小时切割,一般都是按天切割. 那么如何进行切割呢? 思路: 创建日志文件 ...

  7. centeros7安装mysql

    转载自:https://www.linuxidc.com/Linux/2016-09/135288.htm 安装之前先安装基本环境:yum install -y perl perl-Module-Bu ...

  8. Android实习结束后的阶段性总结

    2015年4月14日即将实习结束,在过去的五六个月里,对于Android开发还是学到了很多,临走前将以前做的笔记整理一下,自己也再回顾一次.零散是必然的,也可能只是一小段代码片段,但都是曾经我在学An ...

  9. C++手动调用析构函数无效问题排查

    在学习C++的时候,都知道不要手动调用析构函数,也不要在构造函数.析构函数里调用虚函数.工作这么多年,这些冷门的知识极少用到,渐渐被繁杂的业务逻辑淹没掉. 不过,最近项目里出现了析构函数没有被正确地调 ...

  10. 好好讲一讲,到底什么是Java高级架构师!

    一. 什么是架构师 曾经有这么个段子: 甲:我已经应聘到一家中型软件公司了,今天上班的时候,全公司的人都来欢迎我. 乙:羡慕ing,都什么人来了? 甲:CEO.COO.CTO.All of 程序员,还 ...