[洛谷1119]灾后重建
2022/1/6 6:09:18
本文主要是介绍[洛谷1119]灾后重建,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Description
给出 B 地区的村庄数 N,村庄编号从 0 到 N-1,和所有 M 条公路的长度,公路是双向的。并给出第 i 个村庄重建完成的时间 \(t_i\),你可以认为是同时开始重建并在第 \(t_i\)天重建完成,并且在当天即可通车。若 \(t_i\) 为 0 则说明地震未对此地区造成损坏,一开始就可以通车。之后有 Q 个询问 \((x,y,t)\),对于每个询问你要回答在第 t 天,从村庄 x 到村庄 y 的最短路径长度为多少。如果无法找到从 x 村庄到 y 村庄的路径,经过若干个已重建完成的村庄,或者村庄 x 或村庄 y 在第 t 天仍未重建完成,则需要返回 -1。
HINT
\(N≤200,M≤N \times (N-1)/2,Q≤50000\),所有输入数据涉及整数均不超过100000。
Solution
离线处理。
考虑到floyd的特性:当一个点未被当作中介时,它对最短路的贡献只存在于它在最短路的两端时。
按时间顺序处理询问,按时间顺序枚举中介点更新最短路即可。
code
#include<bits/stdc++.h> using namespace std; const int N=205; int dis[N][N],ti[N],n,m,q; int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) cin>>ti[i]; for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) if(i!=j) dis[i][j]=-1; for(int i=1,u,v,w;i<=m;++i){ scanf("%d%d%d",&u,&v,&w); ++u;++v; dis[u][v]=w;dis[v][u]=w; } scanf("%d",&q); int x,y,t,u=1; while(q--){ scanf("%d%d%d",&x,&y,&t); ++x;++y; for(;u<=n&&ti[u]<=t;++u){ for(int i=1;i<=n;++i) for(int j=1;j<=n;++j){ if(dis[i][u]==-1||dis[u][j]==-1) continue; if(dis[i][j]==-1||dis[i][u]+dis[u][j]<dis[i][j]) dis[i][j]=dis[i][u]+dis[u][j]; } } if(ti[x]<=t&&ti[y]<=t) printf("%d\n",dis[x][y]); else printf("-1\n"); } return 0; }
这篇关于[洛谷1119]灾后重建的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-27OpenFeign服务间调用学习入门
- 2024-12-27OpenFeign服务间调用学习入门
- 2024-12-27OpenFeign学习入门:轻松掌握微服务通信
- 2024-12-27OpenFeign学习入门:轻松掌握微服务间的HTTP请求
- 2024-12-27JDK17新特性学习入门:简洁教程带你轻松上手
- 2024-12-27JMeter传递token学习入门教程
- 2024-12-27JMeter压测学习入门指南
- 2024-12-27JWT单点登录学习入门指南
- 2024-12-27JWT单点登录原理学习入门
- 2024-12-27JWT单点登录原理学习入门