最开始看错数据了没看到Q = 100 是50%的数据以为跑q遍floyd能过,结果只有30,其他全t

1、要注意题目中的条件,挖掘一些性质

var code = “92ce4972-7e0f-4a6f-9f3a-4efef328be45”

2、本题的另一个关键的是要对floyd的过程原理比较熟悉,floyd一共有三重循环,第一重循环相当于枚举的决策,也就是能从那个点转移过来,k就是这个中转站,另外两重循环是枚举的状态

3、我们观察到每个村庄的重建时间是递增的,并且询问的时间也是递增或保持不变,所以我们可以在读入每个询问的时间时,看一下是否存在中转站,在这个时间已经建好,并且可以去更新其他点,我们找到所以这样的点去更新,然后cur不用回去,因为询问的时间也是递增的,只需要在读入下一个询问后,查看是否有新的中转点可以去更新其他点即可。

4、经过上面的分析我们可以知道我们只需要跑一遍floyd即可,因为只有满足的中转点才会被用,时间复杂度为O(n^3)

附上floyd的板子

#include <iostream>
#include <cstring>
#include <algorithm> using namespace std; const int N = 210, INF = 1e9; int n, m, Q; int d[N][N]; void Floyd()
{
for(int k = 1; k <= n; k ++)
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= n; j ++)
//要取一下最小值这个写的时候老是忘记
d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
} int main()
{
cin >> n >> m >> Q;
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= n; j ++)
if(i == j) d[i][j] = 0;
else d[i][j] = INF; for(int i = 0; i < m; i ++)
{
int a, b, w; cin >> a >> b >> w;
d[a][b] = min(d[a][b], w);
} Floyd(); while(Q --)
{
int a, b; cin >> a >> b;
if(d[a][b] > INF / 2) puts("impossible");
else cout << d[a][b]<<endl;;
} return 0;
}

灾后重建

题目背景

B 地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响。但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车。换句话说,只有连接着两个重建完成的村庄的公路才能通车,只能到达重建完成的村庄。

题目描述

给出 B 地区的村庄数

N

N

N,村庄编号从

0

0

0 到

N

1

N-1

N−1,和所有

M

M

M 条公路的长度,公路是双向的。并给出第

i

i

i 个村庄重建完成的时间

t

i

t_i

ti​,你可以认为是同时开始重建并在第

t

i

t_i

ti​ 天重建完成,并且在当天即可通车。若

t

i

t_i

ti​ 为

0

0

0 则说明地震未对此地区造成损坏,一开始就可以通车。之后有

Q

Q

Q 个询问

(

x

,

y

,

t

)

(x,y,t)

(x,y,t),对于每个询问你要回答在第

t

t

t 天,从村庄

x

x

x 到村庄

y

y

y 的最短路径长度为多少。如果无法找到从

x

x

x 村庄到

y

y

y 村庄的路径,经过若干个已重建完成的村庄,或者村庄

x

x

x 或村庄

y

y

y 在第

t

t

t 天仍未重建完成,则需要返回 -1

输入格式

第一行包含两个正整数

N

,

M

N,M

N,M,表示了村庄的数目与公路的数量。

第二行包含

N

N

N个非负整数

t

0

,

t

1

,

,

t

N

1

t_0, t_1,…, t_{N-1}

t0​,t1​,…,tN−1​,表示了每个村庄重建完成的时间,数据保证了

t

0

t

1

t

N

1

t_0 ≤ t_1 ≤ … ≤ t_{N-1}

t0​≤t1​≤…≤tN−1​。

接下来

M

M

M行,每行

3

3

3个非负整数

i

,

j

,

w

i, j, w

i,j,w,

w

w

w为不超过

10000

10000

10000的正整数,表示了有一条连接村庄

i

i

i与村庄

j

j

j的道路,长度为

w

w

w,保证

i

j

i≠j

i=j,且对于任意一对村庄只会存在一条道路。

接下来一行也就是

M

+

3

M+3

M+3行包含一个正整数

Q

Q

Q,表示

Q

Q

Q个询问。

接下来

Q

Q

Q行,每行

3

3

3个非负整数

x

,

y

,

t

x, y, t

x,y,t,询问在第

t

t

t天,从村庄

x

x

x到村庄

y

y

y的最短路径长度为多少,数据保证了

t

t

t是不下降的。

输出格式

Q

Q

Q行,对每一个询问

(

x

,

y

,

t

)

(x, y, t)

(x,y,t)输出对应的答案,即在第

t

t

t天,从村庄

x

x

x到村庄

y

y

y的最短路径长度为多少。如果在第t天无法找到从

x

x

x村庄到

y

y

y村庄的路径,经过若干个已重建完成的村庄,或者村庄x或村庄

y

y

y在第

t

t

t天仍未修复完成,则输出

1

-1

−1。

样例 #1

样例输入 #1

4 5
1 2 3 4
0 2 1
2 3 1
3 1 2
2 1 4
0 3 5
4
2 0 2
0 1 2
0 1 3
0 1 4

样例输出 #1

-1
-1
5
4

提示

对于

30

%

30\%

30%的数据,有

N

50

N≤50

N≤50;

对于

30

%

30\%

30%的数据,有

t

i

=

0

t_i= 0

ti​=0,其中有

20

%

20\%

20%的数据有

t

i

=

0

t_i = 0

ti​=0且

N

>

50

N>50

N>50;

对于

50

%

50\%

50%的数据,有

Q

100

Q≤100

Q≤100;

对于

100

%

100\%

100%的数据,有

N

200

N≤200

N≤200,

M

N

×

(

N

1

)

/

2

M≤N \times (N-1)/2

M≤N×(N−1)/2,

Q

50000

Q≤50000

Q≤50000,所有输入数据涉及整数均不超过

100000

100000

100000。

#include <iostream>
#include <cstring>
using namespace std;
const int N = 210, INF = 2e9; long long d[N][N], a[N];
bool st[N];
int n, m; inline void floyd(int k)
{
for(int i = 0; i < n; ++ i)
for(int j = 0; j < n; ++ j)
if(d[i][j] > d[i][k] + d[k][j])
d[i][j] = d[i][k] + d[k][j]; } int main()
{
// freopen("1.in.txt", "r", stdin);
cin >> n >> m;
for(int i = 0; i < n; ++ i) cin >> a[i];
for(int i = 0; i < n; ++ i)
for(int j = 0; j < n; ++ j)
{
if(i == j) d[i][i] = 0;
d[i][j] = INF;
} for(int k = 0; k < m; ++ k)
{
int a, b ,c; cin >> a >> b >> c;
d[a][b] = d[b][a] = c;
} int q, cur = 0;cin >> q;
while(q --)
{
int x, y, t; cin >> x >> y >> t;
while(a[cur] <= t && cur < n)
{
floyd(cur);
cur ++;
}
if(a[x] > t || a[y] > t || d[x][y] == INF) cout << -1 << endl;
else cout << d[x][y] << endl;
}
return 0;
}

flyod的更多相关文章

  1. cdoj 30 最短路 flyod

    最短路 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/30 Descript ...

  2. hdu 3339 In Action 背包+flyod

    In Action Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=333 ...

  3. Codeforces Gym 100733H Designation in the Mafia flyod

    Designation in the MafiaTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/c ...

  4. hdu 1599 find the mincost route(flyod求最小环)

    Problem Description 杭州有N个景区,景区之间有一些双向的路来连接,现在8600想找一条旅游路线,这个路线从A点出发并且最后回到A点,假设经过的路线为V1,V2,....VK,V1, ...

  5. 最短路Dijkstra和Flyod

    Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要 ...

  6. 『实践』Matlab实现Flyod求最短距离及存储最优路径

    Matlab实现Flyod求最短距离及存储最优路径 一.实际数据 已知图中所有节点的X.Y坐标. 图中的节点编号:矩阵中的编号 J01-J62:1-62; F01-F60:63-122; Z01-Z0 ...

  7. poj 3660 Cow Contest Flyod

    Cow Contest Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5989   Accepted: 3234 Descr ...

  8. Flyod 算法(两两之间的最短路径)

    Flyod 算法(两两之间的最短路径)动态规划方法,通过相邻矩阵, 然后把最后的结果存在这么一个矩阵里面,(i,j), #include <iostream> #include <v ...

  9. UESTC 30最短路(flyod算法)

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  10. Codeforces Round #333 (Div. 2) C. The Two Routes flyod

    C. The Two Routes Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/602/pro ...

随机推荐

  1. TiDB简述及TiKV的数据结构与存储

    1 概述 TiDB 是 PingCAP 公司自主设计.研发的开源分布式关系型数据库,是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical ...

  2. kubernetes(k8s):解决不在同一网段加入集群失败问题

    执行下面命令,将内外网进行映射. iptables -t nat -A OUTPUT -d 10.140.128.121 -j DNAT --to-destination 10.170.129.153 ...

  3. 因为一条DDL,差点搞挂整个系统,这次真的长了教训

    有一次在线上提了一个sql变更,就是下面这条, -- 修改字段的数据类型由varchar(500)变更为text ALTER TABLE t MODIFY COLUMN name text; 提完之后 ...

  4. 天地图三维帮助文档(Cesium)

    https://blog.csdn.net/Tmraz/article/details/114977652

  5. Nginx Ingress Contoller 通过 Envoy 代理和 Jaeger 进行分布式追踪(二)

    1.概述 在<应用程序通过 Envoy 代理和 Jaeger 进行分布式追踪(一)>一文中,我们详细介绍了单个应用程序如何通过 Envoy 和 Jaeger 实现链路追踪的过程.然而,单独 ...

  6. 【io_uring】简介和使用

    文章目录 简介 使用 系统调用 liburing 样例 代码流程 编译 参考资料 简介 io_uring 是 Linux 在 5.1 版本引入的一套新的异步 IO 实现.相比 Linux 在 2.6 ...

  7. 简单对比一下 C 与 Go 两种语言

    以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「ENG八戒」https://mp.weixin.qq.com/s/U6jIT837x5Yxe6Ev1aMDsA 使用一个简单的计数程序将 ...

  8. Go 如何正确关闭通道

    序言 Go 在通道这一块,没有内置函数判断通道是否已经关闭,也没有可以直接获取当前通道数量的方法.所以对于通道,Go 显示的不是那么优雅.另外,如果对通道进行了错误的使用,将会直接引发系统 panic ...

  9. 使用 Rancher 安装 K8s 集群

    舞台环境 Ubuntu 22.04.2 LTS Docker 24.0.2 2GB RAM或者更多 CPU 2核心或者更多 Rancher 2.6.9 测试环境中,我准备了两台 Ubuntu 服务器, ...

  10. Python 基础面试第四弹

    1. Python中常用的库有哪些,作用分别是什么 requests: requests 是一个用于发送 HTTP 请求的库,它提供了简单而优雅的 API,可以轻松地发送 GET.POST.PUT.D ...