计蒜客 百度地图的实时路况
2016-07-06 16:54
351 查看
题目链接
求∑y≠x,y≠zd(x,y,z).
4≤n≤300,边权0≤cost≤104.
实际上对于枚举的一个y,除了y之外其他所有的点都会作为Floyd的中间点枚举到,并且这个枚举的顺序不会影响算法的正确性,所以可以用一个奇妙的分治算法,一次用一个中间点去更新多个邻接矩阵的最短路.
这个分治不太好说清楚,但是看了代码就懂了.
复杂度是O(n3lgn).
题目大意
给定一幅n个节点的有向图,定义d(u,v,w)为从点u出发,不经过点v,到达点w的最短路长度(如果不存在则为−1).求∑y≠x,y≠zd(x,y,z).
4≤n≤300,边权0≤cost≤104.
题解
暴力的做法就是枚举不经过的点y然后跑Floyd,复杂度是O(n4)的.实际上对于枚举的一个y,除了y之外其他所有的点都会作为Floyd的中间点枚举到,并且这个枚举的顺序不会影响算法的正确性,所以可以用一个奇妙的分治算法,一次用一个中间点去更新多个邻接矩阵的最短路.
这个分治不太好说清楚,但是看了代码就懂了.
复杂度是O(n3lgn).
代码
#include<cstdio> #include<cstring> #include<cassert> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; const int N=305,LG=10,INF=1e9; int n; ll ans=0; int mat[LG] ; inline void Max(int &a,int b){ if(b>a)a=b; } inline void Min(int &a,int b){ if(a==-1||b<a)a=b; } void solve(int L,int R,int dep){ if(L==R){ for(int i=1;i<=n;++i){ if(i==L)continue; for(int j=1;j<=n;++j){ if(j==L)continue; ans+=mat[dep][i][j]; } } return; } int mid=L+R>>1; for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) mat[dep+1][i][j]=mat[dep][i][j]; for(int k=mid+1;k<=R;++k) for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) if(mat[dep+1][i][k]!=-1&&mat[dep+1][k][j]!=-1) Min(mat[dep+1][i][j],mat[dep+1][i][k]+mat[dep+1][k][j]); solve(L,mid,dep+1); for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) mat[dep+1][i][j]=mat[dep][i][j]; for(int k=L;k<=mid;++k) for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) if(mat[dep+1][i][k]!=-1&&mat[dep+1][k][j]!=-1) Min(mat[dep+1][i][j],mat[dep+1][i][k]+mat[dep+1][k][j]); solve(mid+1,R,dep+1); } int main(){ scanf("%d",&n); for(int i=1;i<=n;++i) for(int j=1;j<=n;++j){ scanf("%d",&mat[0][i][j]); } solve(1,n,0); cout<<ans<<endl; return 0; }
相关文章推荐
- 计蒜客题库(Python):1、A+B+C问题
- 计蒜客题库(Python):2、整除问题
- 计蒜客题库(Python):3、判断质数
- 计蒜客题库(Python):4、简单裴波那契
- 计蒜客题库(Python):5、矩阵翻转
- 对分治算法的几点思考
- 封装好的Folyd建图,C++源码
- Hdu2066(一个人的旅行)
- Poj2638 网络流+最短路+二分答案
- Aizu1311 分层图最短路 (...大概)
- 关于“2”这个数字
- 最短路径 -- spfa
- hdu 1007 -- Quoit Design
- [Leetcode题解]004 Median of Two Sorted Arrays
- 单源最短路深度分析
- 分治法求最大连续和
- Six Degrees of Cowvin Bacon(最短路径floyd算法)
- Codeforces Round #299
- poj2299 分治
- hdu5137最短路