计蒜客 百度地图的实时路况 (floyd+二分)

原创 2016年08月29日 20:18:53

计蒜客 百度地图的实时路况

题目

中文题意

思路

如果枚举不走的点,那么会是n^4,会超时,在知道floyd的前提下,我们可以二分那个不走的点。就例如有1234四个点,我们先二分后一半得出经过34松弛的矩阵,然后再得出经过234优化的矩阵,这样不走1的结果就出来了,再回溯递归另一半134的矩阵,不走2的答案就出来了,再回溯得出12的矩阵,再递归124得出3,再回溯12,递归123,4的答案就出来了,实在不行可以看代码理解。(还能这么二分。。666)

代码

#include<cstdio>
#include<cstring>
#include<cassert>
#include<iostream>
#include<algorithm>

using namespace std;

typedef long long ll;

const int maxn=310;

int ma[10][maxn][maxn];
ll ans;
int n;

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+=ma[dep][i][j];
            }
        }
        return;
    }
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
            ma[dep+1][i][j]=ma[dep][i][j];
    int m=L+R>>1;
    for(int k=m+1; k<=R; k++)
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
            {
                if(i==j) continue;
                if(ma[dep+1][i][k]==-1||ma[dep+1][k][j]==-1) continue;
                if(ma[dep+1][i][j]==-1)
                    ma[dep+1][i][j]=ma[dep+1][i][k]+ma[dep+1][k][j];
                else
                    ma[dep+1][i][j]=min(ma[dep+1][i][j],ma[dep+1][i][k]+ma[dep+1][k][j]);
            }
    solve(L,m,dep+1);
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
            ma[dep+1][i][j]=ma[dep][i][j];
    for(int k=L; k<=m; k++)
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
            {
                if(i==j) continue;
                if(ma[dep+1][i][k]==-1||ma[dep+1][k][j]==-1) continue;
                if(ma[dep+1][i][j]==-1)
                    ma[dep+1][i][j]=ma[dep+1][i][k]+ma[dep+1][k][j];
                else
                    ma[dep+1][i][j]=min(ma[dep+1][i][j],ma[dep+1][i][k]+ma[dep+1][k][j]);
            }
    solve(m+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",&ma[0][i][j]);
    ans=0;
    solve(1,n,0);
    printf("%lld\n",ans);
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

算法:分治+floyd_计蒜之道复赛A题 百度地图的实时路况

一开始使用枚举来Floyd最短路计算,复杂度O(n^4),超时,确实没招,搜答案,发现了: http://blog.csdn.net/miracle_ma/article/details/518171...

计蒜客 百度地图的实时路况

计蒜客 百度地图的实时路况 题解

计蒜客 百度地图的实时路况

编号从 1到 n 的n个点。定义 d(u,v,w)为从 u 号点出发,严格不经过 v 号点,最终到达 w 号点的最短路径长度,如果不存在这样的路径,d(u,v,w) 的值为 −1。令P=∑1≤x,y,...

2016 计蒜之道 复赛 百度地图的实时路况 [Floyd][分治]

DescriptionDescription定义d(u,v,w)d(u,v,w)为从 uu 号点出发,严格不经过 vv 号点,最终到达 ww 号点的最短路径长度,求∑1≤x,y,z≤n,x≠y,y≠z...

百度地图-实时路况调用实现

效果图 js代码 $(function(){ // 百度地图API功能 var map = new BMap.Map("allmap"); var point = ...

计蒜之道 2017 程序设计大赛 - 计蒜客 复赛 D 百度地图导航 最短路、Dijkstra的拓展

题意:有 n 个点,编号依次为 1 到 n,且有若干个点的集合,编号依次为 1 到 m。每个点集合包含一个或多个点;每个点可能属于多个点集合,也可能不属于任何点集合。 图中中有两种边。第一类边是点u,...

计蒜客 15969 百度地图导航 题解

计蒜客 15969题解

计蒜客 百度地图导航

百度地图上有 nn 个城市,城市编号依次为 11 到 nn。地图中有若干个城市群,编号依次为 11 到 mm。每个城市群包含一个或多个城市;每个城市可能属于多个城市群,也可能不属于任何城市群。 地图...

计蒜客复赛D题 百度地图导航

百度地图上有 nn 个城市,城市编号依次为 11 到 nn。地图中有若干个城市群,编号依次为 11 到 mm。每个城市群包含一个或多个城市;每个城市可能属于多个城市群,也可能不属于任何城市群。 地图中...
  • yo_bc
  • yo_bc
  • 2017-06-10 21:32
  • 148

计蒜客-2017 计蒜之道 复赛-D-百度地图导航

ACM模版描述 题解最短路问题,模版题,SPFA 可以过,BF 应该也可以过的~~~这里的难点不在于求最短路的过程,而是建图的过程,比赛时懵逼了,怎么也建不好,无限 MLE,赛后想到了可以通过建超级...
  • f_zyj
  • f_zyj
  • 2017-06-11 22:21
  • 173
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)