codevs 1817 灾后重建
/*
暴力暴力
离线每次添边
堆优化dij 70
SPFA 80.....
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<vector>
#define maxn 210
using namespace std;
int n,m,Q,num,head[maxn],dis[maxn],t[maxn],f[maxn];
queue<int>q;
struct edge{
int v,pre,t;
}e[maxn*maxn];
struct node{
int u,v,r,t,ans;
}p[maxn*maxn*],P[maxn*maxn*];
int cmp1(const node &x,const node &y){
return x.t<y.t;
}
int cmp2(const node &x,const node &y){
return x.r<y.r;
}
void Add(int from,int to,int dis){
num++;e[num].v=to;
e[num].pre=head[from];
e[num].t=dis;
head[from]=num;
}
int SPFA(int u,int v,int now){
if(now<t[u]||now<t[v])return -;
memset(dis,/,sizeof(dis));
memset(f,,sizeof(f));
int inf=dis[];f[u]=;
dis[u]=;q.push(u);
while(!q.empty()){
int k=q.front();q.pop();f[k]=;
for(int i=head[k];i;i=e[i].pre){
int v=e[i].v;
if(dis[v]>dis[k]+e[i].t){
dis[v]=dis[k]+e[i].t;
if(f[v]==){
f[v]=;q.push(v);
}
}
}
}
if(dis[v]==inf)return -;
return dis[v];
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<n;i++)
scanf("%d",&t[i]);
int u,v,ti;
for(int i=;i<=m;i++){
scanf("%d%d%d",&u,&v,&ti);
p[i].u=u;p[i].v=v;p[i].r=ti;
p[i].t=max(t[u],t[v]);
}
sort(p+,p++m,cmp1);
scanf("%d",&Q);
for(int i=;i<=Q;i++){
scanf("%d%d%d",&u,&v,&ti);
P[i].t=ti;P[i].u=u;
P[i].v=v;P[i].r=i;
}
sort(P+,P++Q,cmp1);
int now=,x=;
for(int i=;i<=Q;i++){
now=P[i].t;
while(p[x].t<=now&&x<=m){
Add(p[x].u,p[x].v,p[x].r);
Add(p[x].v,p[x].u,p[x].r);
x++;
}
P[i].ans=SPFA(P[i].u,P[i].v,now);
}
sort(P+,P++Q,cmp2);
for(int i=;i<=Q;i++)
printf("%d\n",P[i].ans);
return ;
}
/*
加深了对floyed的理解
实质是dp
d[k][i][j] 表示i-j只经过1-k的节点作为中间点的最短路
有两种情况 走或者不走k
f[k][i][j]=min(f[k-1][i][j],f[k-1][i][k]+f[k-1][k][j])
可以压缩空间压掉第一维
嗯这个题各种提示用floyed啊
首先t是小到大的
还有就是输入数据时不降的
我还傻傻的离线sort做....
结合题目每次询问i->j 保证中间经过的一定是修好了的城市
只要满足 经过的在这之前都修好了
那根据对floyed的理解 保证循环k<=t就好了
*/
#include<cstdio>
#define maxn 210
using namespace std;
int n,m,k,Q,t[maxn],f[maxn][maxn],inf;
int min(int x,int y){
return x<y?x:y;
}
int init(){
int x=;char s=getchar();
while(s<''||s>'')s=getchar();
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x;
}
int Floyed(int u,int v,int ti){
if(t[u]>ti||t[v]>ti)return -;
for(;k<n&&t[k]<=ti;k++)
for(int i=;i<n;i++)
for(int j=;j<n;j++)
f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
if(f[u][v]==inf)return -;
else return f[u][v];
}
int main()
{
n=init();m=init();
for(int i=;i<n;i++)
t[i]=init();
int u,v,ti;
inf=0x3f3f3f3f;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
f[i][j]=inf;
for(int i=;i<n;i++)
f[i][i]=;
for(int i=;i<=m;i++){
u=init();v=init();ti=init();
f[u][v]=f[v][u]=ti;
}
Q=init();
while(Q--){
u=init();v=init();ti=init();
printf("%d\n",Floyed(u,v,ti));
}
return ;
}
codevs 1817 灾后重建的更多相关文章
- CODEVS 1817 灾后重建 Label:Floyd || 最短瓶颈路
描述 灾后重建(rebuild) B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两 ...
- AC日记——灾后重建 洛谷 P1119
灾后重建 思路: 看到n<=200,思考弗洛伊德算法: 如何floyed呢? floyed是一种动态规划求最短路的算法: 它通过枚举中间点来更新两点之间最短路: 回到这个题本身: 所有点的重建完 ...
- 洛谷——P1119 灾后重建
P1119 灾后重建 题目背景 B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两个重 ...
- 【洛谷P1119题解】灾后重建——(floyd)
这道题告诉我,背的掉板子并不能解决一切问题,理解思想才是关键,比如不看题解,我确实想不清楚这题是弗洛伊德求最短路 (我不该自不量力的说我会弗洛伊德了我错了做人果然要谦虚) 灾后重建 题目背景 B地区在 ...
- 洛谷 P1119 灾后重建 最短路+Floyd算法
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P1119 灾后重建 题目描述 B地区在地震过后,所有村 ...
- java实现第六届蓝桥杯灾后重建
灾后重建 题目描述 Pear市一共有N(<=50000)个居民点,居民点之间有M(<=200000)条双向道路相连.这些居民点两两之间都可以通过双向道路到达.这种情况一直持续到最近,一次严 ...
- [Luogu P1119] 灾后重建 (floyd)
题面 传送门:https://www.luogu.org/problemnew/show/P1119 Solution 这题的思想很巧妙. 首先,我们可以考虑一下最暴力的做法,对每个时刻的所有点都求一 ...
- 【u110】灾后重建
Time Limit: 1 second Memory Limit: 128 MB [问题描述] B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前, ...
- 洛谷P1119 灾后重建[Floyd]
题目背景 B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两个重建完成的村庄的公路才能 ...
随机推荐
- Web Adaptor重装配置时 提示已经配置成功的问题
环境 ArcGIS 10.1/10.2/10.3 Windwos 8.1 Tomcat 7.0.5 问题描述 较早之前在本机上安装配置过一个10.2.1版本的ArcGIS产品,包括桌面.Server和 ...
- 【Tools】Chrome 控制台不完全指南
Chrome的开发者工具已经强大到没朋友的地步了,特别是其功能丰富界面友好的console,使用得当可以有如下功效: 更高「逼格」更快「开发调试」更强「进阶级的Frontender」 Bug无处遁形「 ...
- 你真的有必要退出吗——再说Android程序的退出功能
转自你真的有必要退出吗--再说Android程序的退出功能 搞Android开发有一段时间了,相信很多从Windows开发过来的Android程序员都习惯性地会跟我一样遇到过同一个问题:如何彻底退出程 ...
- MVC自学系列之一(MVC入门篇)
MVC是如何适用于ASP.NET中的 自从2002年ASP.NET 1.0版本的首次发布,就知道ASP.NET和Web Forms是同样一回事.ASP.NET由抽象两层类所支持: -->Sy ...
- Java语言基础(二) Java关键字
Java语言基础(二) Java关键字 Java关键字比较多,我就不列举出来了,只记录一些常用的小知识点: ①Java的关键字只有小写. ②then.sizeof都不是Java的关键字,熟悉C++的程 ...
- java 集合框架图
Java平台提供了一个全新的集合框架.“集合框架”主要由一组用来操作对象的接口组成.不同接口描述一组不同数据类型. Java 2集合框架图集合接口:6个接口(短虚线表示),表示不同集合类型,是集合框架 ...
- 利用纯java捕获和播放音频
参考: 1.http://www.cjsdn.net/doc/jdk60/javax/sound/sampled/package-summary.html 2.http://www.cjsdn.net ...
- HDOJ 2018 母牛的故事
Problem Description 有一头母牛,它每年年初生一头小母牛.每头小母牛从第四个年头开始,每年年初也生一头小母牛.请编程实现在第n年的时候,共有多少头母牛? Input 输入数据由多个测 ...
- JavaScript高级程序设计4.pdf
虽然执行环境的类型总共只有两种——全局和局部(函数),但还有其他方法延长作用域链,有些语句可以在作用域链的前端临时增加一个变量对象,执行后会被移除try-catch语句的catch块和with语句 w ...
- 内存数据库MemSQL ——基于内存,MVCC+哈希表、跳表
本周数据库业界探讨最火热的话题就是MemSQL,究竟是不是"旧瓶装新酒"引发了诸多的辩论,同时也引发了究竟是产品技术重要还是DBA重要的疑问.网络中有一些关于MemSQL的介绍,基 ...