zoukankan      html  css  js  c++  java
  • [洛谷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;
    }
    
  • 相关阅读:
    Markdown示例
    初识Markdown
    Ubuntu源整理
    Vi编辑器入门
    Ubuntu,Linux入门系统
    [其他]volatile 关键字
    Qt5:随窗口大小变化背景图片自动缩放的实现
    Qt5:不规则按钮的实现---通过贴图实现
    windows编程:创建DLL
    [转]Firefox拦截12306订票网站的解决办法
  • 原文地址:https://www.cnblogs.com/AireenYe/p/15769494.html
Copyright © 2011-2022 走看看