题目传送门

这道题我们很容易想到对于每次询问,都跑一遍最短路(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 ;
}

审题!审题!别丢条件!

最新文章

  1. [Sass]嵌套
  2. RESTful接口设计原则/最佳实践(学习笔记)
  3. 使用SqlBulkCopy类来批量复制数据
  4. H5游戏开发之Stick Hero
  5. 基于DDD的.NET开发框架 - ABP模块设计
  6. 服务器端查看log的shell脚本
  7. CSS 最核心的四个概念(摘录)
  8. 【No.4 Ionic】修改 cordova 插件
  9. 【jQuery UI 1.8 The User Interface Library for jQuery】.学习笔记.5.Accordion控件
  10. UML建模类型(转载)
  11. java中的final、finally和finalize
  12. [Selenium]中使用css选择器进行元素定位
  13. 【USACO 2012 Open】Running Laps(树状数组)
  14. FoxOne---一个快速高效的BS框架--WEB控件属性编辑器
  15. 第四节 二维条码与磁卡、IC卡、光卡之比较
  16. js日期操作
  17. android --拍照,从相册获取图片,兼容高版本,兼容小米手机
  18. 《java.util.concurrent 包源码阅读》16 一种特别的BlockingQueue:SynchronousQueue
  19. UWP 手绘视频创作工具技术分享系列 - 手绘视频与视频的结合
  20. Visionpro学习笔记 :QuickBuild-Based Application Run-Once Button

热门文章

  1. BZOJ——2697: 特技飞行
  2. 原生js中stopPropagation,preventDefault,return false的区别
  3. Html.EditorFor 加 htmlAttributes
  4. Spring MVC异常处理实例
  5. 【TFS 2017 CI/CD系列 - 02】-- Build篇
  6. jmeter的线程组执行顺序不以其出现的顺序发生变化
  7. Web容器自己主动对HTTP请求中參数进行URLDecode处理
  8. 如何把你的Windows PC变成瘦客户机
  9. Spring4.0MVC学习资料,注解自己主动扫描bean,自己主动注入bean(二)
  10. 相机标定(Camera calibration)