ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[洛谷1119]灾后重建

2022-01-06 01:31:44  阅读:166  来源: 互联网

标签:洛谷 int 短路 村庄 灾后 ti 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;
}

标签:洛谷,int,短路,村庄,灾后,ti,1119,询问,重建
来源: https://www.cnblogs.com/AireenYe/p/15769494.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有