博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【洛谷习题】灾后重建
阅读量:4499 次
发布时间:2019-06-08

本文共 1520 字,大约阅读时间需要 5 分钟。

题目链接:


 

暴力的做法很容易想到,对于每次询问,将修好的点加到图上,复杂度可以是O(mlogn*q),粗略算一下会炸。看到N<=200,忽然想到了Floyd,又想将询问保存,倒序处理,也就是每次删边,毫无疑问这是错误的。然后翻看dalao的博客,才意识到,原来Floyd是这样的!Floyd的原理是动态规划,d[i][j]=min(d[i][j],d[i][k]+dp[k][j]),关键是在此之前要得到d[i][k]和d[k][j],因此是先枚举k。在枚举到k之前,k并不会作为某条最短路的中间点。所以只要保证每个结点是依次加入到图中的,那么每次用新加入的结点作为中间点更新所有的最短路,得到的就是此时图上的最短路。这道题的输入刚好是按加入顺序(每次询问t递增)。

1 #include 
2 #include
3 4 const int maxn = 205, inf = 0x3f3f3f3f; 5 6 int repair[maxn], dist[maxn][maxn]; 7 8 int main() { 9 int n, m, q;10 scanf("%d%d", &n, &m);11 for (int i = 0; i < n; ++i) scanf("%d", &repair[i]);12 repair[n] = inf;13 memset(dist, inf, sizeof(dist));14 for (int i = 1; i <= m; ++i) {15 int u, v, w;16 scanf("%d%d%d", &u, &v, &w);17 dist[u][v] = dist[v][u] = w;18 }19 scanf("%d", &q);20 int x, y, t;21 scanf("%d%d%d", &x, &y, &t);22 --q;23 for (int k = 0; k <= n; ++k) {24 while (t < repair[k]) {25 if (repair[x] > t || repair[y] > t || dist[x][y] == inf)26 printf("-1\n");27 else printf("%d\n", dist[x][y]);28 if (!q) return 0;29 scanf("%d%d%d", &x, &y, &t);30 --q;31 }32 for (int i = 0; i < n; ++i)33 for (int j = 0; j < n; ++j)34 if (dist[i][j] > dist[i][k] + dist[k][j])35 dist[i][j] = dist[i][k] + dist[k][j];36 }37 return 0;38 }
AC代码

 

转载于:https://www.cnblogs.com/Mr94Kevin/p/9553508.html

你可能感兴趣的文章
Linux:xargs命令详解
查看>>
Flex 布局教程:语法篇
查看>>
明天你好
查看>>
Spring 分散装配
查看>>
漫话爬取
查看>>
sublime js插件
查看>>
C# 添加,修改,删除Xml节点
查看>>
float浮点数的四舍五入
查看>>
QQ消息记录、接收文件、图片、拍照照片等保存位置
查看>>
IOC与AOP介绍
查看>>
关于求最大公约数
查看>>
Git常用命令学习总结
查看>>
【转载】C#通过Rows.Count属性获取总行数
查看>>
【转载】通过百度站长平台查看网站搜索流量及关键字
查看>>
【转载】Visual Studio2017如何打包发布Winform窗体程序
查看>>
【转载】通过搜狗站长平台手动向搜狗搜索提交死链
查看>>
【转载】通过搜狗站长平台手动向搜狗搜索提交文章加快收录
查看>>
【转载】通过百度站长平台提交网站死链
查看>>
【转载】通过搜狗站长平台提交网站域名变更后的文章地址
查看>>
【转载】Visual Studio2017中如何设置解决方案中的某个项目为启动项目
查看>>