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

description

给出有向图的点数\(n\)和邻接矩阵\(G\),

求\[P=∑_{1≤x,y,z≤n,x≠y,y≠z}d(x,y,z)\]

其中\(d(x,y,z)\)表示从\(x\)不经过\(y\)到\(z\)的最短路,如果无法到达则为\(-1\)

data range

\[4≤n≤300,?1≤G_{i,j}≤10000,G_{i,i}=0\]

solution

首先你要知道\(floyed\)的本质是枚举中转点

那么不经过\(y\)点的最短路矩阵相当于使用除\(y\)以外的点作为中转点更新后的邻接矩阵

于是考虑分治,递归到\(l==r\)时仅有节点\(l\)未被作为中转点

那么在做到\([l,r]\)时,使用\([l,mid]\)更新\([mid+1,r]\),使用\([mid+1,r]\)更新\([l,mid]\)即可。

Code

#include<bits/stdc++.h>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<iomanip>
#include<cstring>
#include<complex>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<ctime>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define Cpy(x,y) memcpy(x,y,sizeof(x))
#define Set(x,y) memset(x,y,sizeof(x))
#define FILE "a"
#define mp make_pair
#define pb push_back
#define RG register
#define il inline
using namespace std;
typedef unsigned long long ull;
typedef vector<int>VI;
typedef long long ll;
typedef double dd;
const int N=200010;
const int M=1000010;
const dd eps=1e-5;
const int inf=2147483647;
const ll INF=1ll<<60;
const ll P=100000;
il ll read(){
  RG ll data=0,w=1;RG char ch=getchar();
  while(ch!=‘-‘&&(ch<‘0‘||ch>‘9‘))ch=getchar();
  if(ch==‘-‘)w=-1,ch=getchar();
  while(ch<=‘9‘&&ch>=‘0‘)data=data*10+ch-48,ch=getchar();
  return data*w;
}

il void file(){
  srand(time(NULL)+rand());
  freopen(FILE".in","r",stdin);
  freopen(FILE".out","w",stdout);
}

int n;ll ans,g[20][305][305];
void divide(int l,int r,int d){
  if(l==r){
    for(RG int i=1;i<=n;i++)
      for(RG int j=1;j<=n;j++)
    if(i!=l&&j!=l)ans+=g[d-1][i][j];
    return;
  }

  RG int mid=(l+r)>>1;

  memcpy(g[d],g[d-1],sizeof(g[d]));
  for(RG int k=mid+1;k<=r;k++)
    for(RG int i=1;i<=n;i++)
      if(k!=i)
    for(RG int j=1;j<=n;j++)
      if(k!=j&&i!=j&&g[d][i][k]!=-1&&g[d][k][j]!=-1)
        if(g[d][i][j]==-1||g[d][i][j]>g[d][i][k]+g[d][k][j])
          g[d][i][j]=g[d][i][k]+g[d][k][j];
  divide(l,mid,d+1);

  memcpy(g[d],g[d-1],sizeof(g[d]));
  for(RG int k=l;k<=mid;k++)
    for(RG int i=1;i<=n;i++)
      if(k!=i)
    for(RG int j=1;j<=n;j++)
      if(k!=j&&i!=j&&g[d][i][k]!=-1&&g[d][k][j]!=-1)
        if(g[d][i][j]==-1||g[d][i][j]>g[d][i][k]+g[d][k][j])
          g[d][i][j]=g[d][i][k]+g[d][k][j];
  divide(mid+1,r,d+1);
}

int main()
{
  n=read();
  for(RG int i=1;i<=n;i++)
    for(RG int j=1;j<=n;j++)
      g[0][i][j]=read();
  divide(1,n,1);
  printf("%lld\n",ans);
  return 0;
}

原文地址:https://www.cnblogs.com/cjfdf/p/9703587.html

时间: 2024-10-11 12:08:15

[计蒜客]百度地图的实时路况的相关文章

2016计蒜之道复赛A 百度地图的实时路况

百度地图的实时路况功能相当强大,能方便出行的人们避开拥堵路段.一个地区的交通便捷程度就决定了该地区的拥堵情况.假设一个地区有 nnn 个观测点,编号从 111 到 nnn.定义 d(u,v,w)d(u,v,w)d(u,v,w) 为从 uuu 号点出发,严格不经过 vvv 号点,最终到达 www 号点的最短路径长度,如果不存在这样的路径,d(u,v,w)d(u,v,w)d(u,v,w) 的值为 −1-1−1. 那么这个地区的交通便捷程度 PPP 为: P=∑1≤x,y,z≤n,x≠y,y≠zd(x

百度地图的实时路况

百度地图的实时路况功能相当强大,能方便出行的人们避开拥堵路段.一个地区的交通便捷程度就决定了该地区的拥堵情况.假设一个地区有 nn 个观测点,编号从 11 到 nn.定义 d(u,v,w)d(u,v,w) 为从 uu 号点出发,严格不经过 vv 号点,最终到达 ww 号点的最短路径长度,如果不存在这样的路径,d(u,v,w)d(u,v,w) 的值为 -1−1. 那么这个地区的交通便捷程度 PP 为: P = \sum_{1 \leq x,y,z \leq n , x \neq y , y \ne

2016计蒜之道复赛 百度地图的实时路况 floyd+cdq分治

链接:https://nanti.jisuanke.com/t/11217 奉上官方题解: 枚举 d(x , y , z) 中的 y,把 y 从这个图中删去,再求这时的全源最短路即可,使用 Floyd 算法来做上述过程. Floyd 算法可以是一个增量的过程,虽然第一维一般都是从 1枚举到 k但是这个枚举的顺序并不影响最后的结果. 所以如果可以预处理出对于每个点 y,只剩 y 没有在 Floyd 的第一维枚举到的矩阵,这个矩阵的值就是不经过 y 点的全源最短路. 所以使用分治,每一次把点集拆成两

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

题目链接:https://nanti.jisuanke.com/t/A1108 这道题还挺有意思的.让我对Floyd的了解又加深了一点. 首先我们重新审视Floyd这三重循环到底有什么用?第一层是枚举中间结点,第二三层是枚举路径起点和终点.那么是不是当第一层循环还没枚举到的点,此时的最短路就不会经过这这些点呢? 答案是肯定的.所以这道题也就可以做了. 题目是要求我们计算  第一层循环缺一个点的情况下  的所有最短路之和.我们当然可以枚举这个缺的点,那么时间复杂度是O(n^4).不能接受. 那么我

百度地图的实时路况 2016 计蒜之道 复赛

https://nanti.jisuanke.com/t/A1108 way1: 应该很多同学的做法都是对于每次y,每次x,dijkstra+堆优化 n^2 * nlogn 其实log(300)很小... way2: 题解方法真心优秀!!! cdq分治 有助于理解floyd:每次加入一个可以使用的点,加n次,顺序可以调整 本题:对于每个y,仅仅是y点不能使用 每次计算1/2,cdq剩下的1/2(left,right分别来一次),直到只剩下一个数,这个点不用于求最短路.所有点都有且仅有一次出现“只

计蒜客 无脑博士和他的试管们

无脑博士有三个容量分别是A,B,C升的试管,A,B,C分别是三个从1到20的整数,最初,A和B试管都是空的,而C试管是装满硫酸铜溶液的.有时,无脑博士把硫酸铜溶液从一个试管倒到另一个试管中,直到被灌试管装满或原试管空了.当然每一次灌注都是完全的.由于无脑博士天天这么折腾,早已熟练,溶液在倒的过程中不会有丢失. 写一个程序去帮助无脑博士找出当A是个是空的时候,C试管中硫酸铜溶液所剩量的所有可能性. 输入包括一行,为空格分隔开的三个数,分别为整数A,B和C. 输出包括一行,升序地列出当A试管是空的时

简单斐波那契——计蒜客(4)

题目来自“计蒜客”第4题. 解算法题之前,务必先写出与之对应的数学表达式,用于描述算法. 数学描述如图: 根据“数学描述“,写出代码如下: #include <stdio.h> int main() { int N =0 ; scanf("%d", &N); int i, fn1 = 1, fn2 = 0, fn; switch(N) { case 0: printf("0"); break; case 1: printf("1&quo

计蒜客普及组模拟赛

今天没事闲的看到计蒜客有个普及组模拟赛,就当练了练手去打了,成绩低的可怜...400分崩成280分AK梦想化作泡影 第一题 同学的爱好 链接:https://nanti.jisuanke.com/t/17291 小学应用题难度?大概画个图就能懂,把每个部分都标上号,算出a,b,c,d,e,f的部分,进行运算就行了. 不多解释了,直接上代码 #include<iostream> #include<cstdio> #include<algorithm> #include&l

百度地图绘制实时路线以及最短线路规划

如何使用百度地图绘制实时路线以及最短线路规划 最近在做百度地图的实时路线绘制,发现一些问题,比如由于定位漂移带来的路线绘制偏差,还有由于定位漂移,导致人未走动时,也会绘制路线等.百度鹰眼的线路纠偏个人感觉很一般啊.而且有限漂移了两百米的点他也没有纠正过来.所以最后还是决定自己写一个纠偏吧.而且百度地图官方的dome和示例代码真的很示例啊.然人摸不着头脑.ok进入正题,思路是这样的,因为实时绘制线路都是在室外,所以只采用gps定位,不采用无线网络定位.这样漂移一两百米的点基本不会出现.第二当人在等