Luogu P1119 灾后重建 【floyd】By cellur925
这道题我们很容易想到对于每次询问,都跑一遍最短路(spfa,虽然他已经死了)。只需在松弛的时候加入当前相关的点是否已经修好的判断,果不其然的TLE了4个点。
(然鹅我第一次用spfa跑的时候竟然全WA了,震惊!由于节点从0开始标号,所以head数组要预处理为-1,遍历的时候for(int i=head[x];i!=-1;i=edge[i].next啊啊啊啊啊)
Code_TLE
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue> using namespace std;
const int inf=; int n,m,Q,tot;
int ddl[],dis[],head[];
bool vis[];
struct node{
int next,to,val;
}edge[]; void add(int x,int y,int z)
{
edge[++tot].to=y;
edge[tot].val=z;
edge[tot].next=head[x];
head[x]=tot;
} int spfa_ask(int s,int t,int T)
{
memset(vis,,sizeof(vis));
for(int i=;i<n;i++) dis[i]=inf;
queue<int>q;
q.push(s);dis[s]=;vis[s]=;
while(!q.empty())
{
int x=q.front();
q.pop();vis[x]=;
for(int i=head[x];i!=-;i=edge[i].next)
{
int y=edge[i].to;
if(dis[y]>dis[x]+edge[i].val&&ddl[y]<=T&&ddl[x]<=T)
{
dis[y]=dis[x]+edge[i].val;
if(!vis[y]) q.push(y),vis[y]=;
}
}
}
if(dis[t]==inf) dis[t]=-;
return dis[t];
} int main()
{
memset(head,-,sizeof(head));
scanf("%d%d",&n,&m);
for(int i=;i<n;i++) scanf("%d",&ddl[i]);
for(int i=;i<=m;i++)
{
int x=,y=,z=;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);add(y,x,z);
}
scanf("%d",&Q);
while(Q--)
{
int x=,y=,T=;
scanf("%d%d%d",&x,&y,&T);
printf("%d\n",spfa_ask(x,y,T));
}
return ;
}
万万没想到,正解竟然是--floyd!
其实看似繁琐的题目已经隐藏着真相--
本题的数据范围n<=200,这对于最短路题目来说是十分超常友善的:)也正暗喻着本题floyd才是正解。
正解:
我们考虑floyd的算法,本质是一个动态规划,最外层枚举中心点,注意到每次询问的时间有单调性,那么我们可以每次把两次询问间新建出的村庄的floyd跑好得出答案。
看题解在这卡了很久,结果发现自己忽略了一个条件:输入村庄的修复时间也是有单调性的,有了这个条件一切不就顺理成章了嘛。
Code
#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; int n,m,Q,pos,limit;
int ddl[];
int f[][]; int main()
{
scanf("%d%d",&n,&m);
memset(f,0x3f,sizeof(f));
limit=f[][];
for(int i=;i<n;i++) scanf("%d",&ddl[i]),f[i][i]=;
for(int i=;i<=m;i++)
{
int x=,y=,z=;
scanf("%d%d%d",&x,&y,&z);
f[x][y]=z;f[y][x]=z;
}
scanf("%d",&Q);
while(Q--)
{
int x=,y=,t=;
scanf("%d%d%d",&x,&y,&t);
if(ddl[x]>t||ddl[y]>t)
{
printf("-1\n");
continue;
}
while(ddl[pos]<=t&&pos<n)
{
for(int i=;i<n;i++)
for(int j=;j<n;j++)
f[i][j]=min(f[i][j],f[i][pos]+f[pos][j]);
pos++;
}
if(f[x][y]==limit)
{
printf("-1\n");
continue;
}
printf("%d\n",f[x][y]);
}
return ;
}
审题!审题!别丢条件!
Luogu P1119 灾后重建 【floyd】By cellur925的更多相关文章
- [Luogu P1119] 灾后重建 (floyd)
题面 传送门:https://www.luogu.org/problemnew/show/P1119 Solution 这题的思想很巧妙. 首先,我们可以考虑一下最暴力的做法,对每个时刻的所有点都求一 ...
- 洛谷P1119 灾后重建 Floyd + 离线
https://www.luogu.org/problemnew/show/P1119 真是有故事的一题呢 半年前在宁夏做过一道类似的题,当时因为我的愚昧痛失了金牌. 要是现在去肯定稳稳的过,真是生不 ...
- 洛谷P1119灾后重建——Floyd
题目:https://www.luogu.org/problemnew/show/P1119 N很小,考虑用Floyd: 因为t已经排好序,所以逐个加点,Floyd更新即可: 这也给我们一个启发,如果 ...
- 洛谷P1119 灾后重建[Floyd]
题目背景 B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两个重建完成的村庄的公路才能 ...
- [Luogu P1119]灾后重建
这是一道考Floyd本质的题. 回忆一下Floyd的原理,三层循环,最外层循环枚举的是中转点,也就是用两点到中转点距离之和来更新最短路.然后来看下题目,重建时间是按照从小到大排序的,也就是说,当第i个 ...
- P1119 灾后重建 floyd
题目背景 BB地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两个重建完成的村庄的公路才 ...
- 洛谷 P1119 灾后重建 最短路+Floyd算法
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P1119 灾后重建 题目描述 B地区在地震过后,所有村 ...
- 洛谷——P1119 灾后重建
P1119 灾后重建 题目背景 B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两个重 ...
- 【Luogu】P1119灾后重建(Floyd)
题目链接 见题解: feilongz. 这里只放代码. #include<cstdio> #include<cstring> #include<cstdlib> # ...
随机推荐
- Atom安装代码格式化插件atom-beautify
官网:https://github.com/Glavin001/atom-beautify 效果: 使用: [cmd]-[shift]-[p]或者[ctrl]-[shift]-[p]
- ArcGIS中Shapefile和Geodatabase坐标容差的问题
转自原文 ArcGIS中Shapefile和Geodatabase坐标容差的问题 ArcGIS中,Shapefile文件是没有容差设置的,所以无论什么单位的坐标写入shapefile文件,都不存在容差 ...
- Ribbon简介
Ribbon简介
- Office EXCEL 表格如何设置某个单元格是选择项,如何设置一级下拉菜单
1 比如我要在C这一列都做成下拉菜单,则我选中这一列的第一个单元格,然后点击数据-有效性,然后把允许改成"序列",在来源中输入每一项(用逗号隔开),比如我一共要做四个下拉菜单选项, ...
- Linux 将一般的用户加入sudo组is_not_in_the_sudoers_file._This_incident_will_be_reported解决方法
在一般用户下执行sudo命令提示xxx is not in the sudoers file. This incident will be reported.解决方法: $where ...
- iOS开发--URL中汉字出现乱码
NSURL *nurl=[[NSURL alloc] initWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF ...
- com.squareup.timessquare.CalendarPickerView
com.squareup.timessquare.CalendarPickerView https://github.com/square/android-times-square
- 【扩展知识2】函数strlen()和非函数sizeof的使用
[扩展知识2]函数strlen()和非函数sizeof的使用 [扩展文件夹] strlen函数 sizeof ( 1 )函数strlen() 原型:size_tstrlen ( const char ...
- 【leetcode】Word Break(python)
思路是这种.我们从第一个字符開始向后依次找,直到找到一个断句的地方,使得当前获得的子串在dict中,若找到最后都没找到.那么就是False了. 在找到第一个后,接下来找下一个断句处,当然是从第一个断句 ...
- RabbitMQ常用命令、管理界面
1.运行CMD,cd切换到RabbitMQ安装目录sbin下E:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.2\sbin 执行 rabbitm ...