2016计蒜之道复赛 百度地图的实时路况 分治+Floyd
2024-08-24 01:34:56
题目链接:https://nanti.jisuanke.com/t/A1108
这道题还挺有意思的。让我对Floyd的了解又加深了一点。
首先我们重新审视Floyd这三重循环到底有什么用?第一层是枚举中间结点,第二三层是枚举路径起点和终点。那么是不是当第一层循环还没枚举到的点,此时的最短路就不会经过这这些点呢?
答案是肯定的。所以这道题也就可以做了。
题目是要求我们计算 第一层循环缺一个点的情况下 的所有最短路之和。我们当然可以枚举这个缺的点,那么时间复杂度是O(n^4)。不能接受。
那么我们可以反过来考虑不是缺点,而是考虑逐渐加点,逐渐加到缺一个点的情况然后更新答案。于是我们可以分治,分治的过程就是加点的过程。
solve(l,r)代表除了区间[l,r]的点其他点都加到最短路了,那么分治到l==r的时候就可以统计答案了。
时间复杂度O(n^2*logn)。细节详见代码:
#include<bits/stdc++.h>
using namespace std;
const int N=3e2+;
const int INF=0x3f3f3f3f;
int n,a[N][N];
long long ans; void solve(int l,int r) {
if (l==r) {
for (int i=;i<=n;i++) for (int j=;j<=n;j++)
if (i!=l && j!=l)
if (a[i][j]>=INF) ans+=-; else ans+=a[i][j];
return;
}
int mid=l+r>>; int b[N][N];
memcpy(b,a,sizeof(a));
for (int k=mid+;k<=r;k++)
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
solve(l,mid); memcpy(a,b,sizeof(b));
for (int k=l;k<=mid;k++)
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
solve(mid+,r);
} int main()
{
cin>>n;
for (int i=;i<=n;i++) for (int j=;j<=n;j++) {
scanf("%d",&a[i][j]);
if (a[i][j]==-) a[i][j]=INF;
}
solve(,n);
cout<<ans<<endl;;
return ;
}
最新文章
- VmWare平台Windows Server 2012 无响应宕机
- Java设计模式之创建型模式
- Centos 7 ASP.NET Core 1.0 Docker部署
- 使用dnsmasq来提升CentOS上网速度
- 玩转PowerShell第一节——【后台任务处理】-技术&;分享
- log4j日志优先级问题的后续
- blade模版之页面的嵌套
- apache 多站点搭建
- BZOJ 1151 傲娇的人 排序
- Openjudge-计算概论(A)-找和为K的两个元素
- E - 小晴天老师系列——我有一个数列!
- IIS 反向代理 golang web开发
- LeetCode之“排序”:Largest Number
- shell脚本实现并发控制
- 在ASP.NET Core中实现自定义验证特性(Custom Validation Attribute)
- hdu 3832 Earth Hour bfs
- Python 实例变量
- BZOJ.1017.[JSOI2008]魔兽地图(树形DP 背包DP)
- ArcGIS 在高清屏中主界面界面字体和图标显示过小,如何解决?
- Dll 使用 PChar 参数的小例子 - 回复 ";linximf"; 的问题
热门文章
- JQuery通过URL获取图片宽高
- 解决error: Microsoft Visual C++ 14.0 is required 问题
- C盘Administrator中 .m2/repository里面是什么
- Sql语法整理-图片版....
- Xcode 编辑器之关于Other Linker Flags相关问题
- paper 144:人生苦短,快用Python
- python random模块随机取list中的某个值
- 51NOD 1005
- restTemplate源码详解深入剖析底层实现思路
- js实现复选框全选/全不选/反选