题意:

给定一张无向图,求任意两点之间的所有最短路覆盖的边数。


解析:

这题自己没鼓捣出来,想了好多奇怪的东西,我觉得好像是跟之前某个考试题混一起去了,思路的出发点错了。


n<=500,所以我们可以用floyd预处理出任意两点间的最短路。
接下来的问题就是如何处理覆盖的问题了。
正解是个看起来很简单的递推。
首先我们枚举终点。
然后我们可以处理出f数组。
f数组的定义是f[x]代表x到终点的所有最短路上覆盖的与x相邻的边的条数。
这个东西的计算我们只需要枚举跟x相邻的边,并且判断该边的另一个端点是否在x到终点的最短路上即可,如果在,那么对f[x]的贡献为1。
所以这个的计算复杂度为O(n^3)。
接下来我们枚举起点。
再枚举中间点x。
如果该中间点x在起点到终点的最短路上的话,那么显然对这一对点覆盖的边数的贡献为f[x]。
直接统计即可。
复杂度O(n^3)。


代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 510
#define INF 0x3f3f3f3f3f3f3f3fll
using namespace std;
typedef long long ll;
int n,m;
ll map[N][N];
ll ans[N][N],f[N];
int head[N];
int cnt;
struct node
{int from,to,next;ll val;
}edge[(N*N)<<1];
void init()
{memset(head,-1,sizeof(head));cnt=1;
}
void edgeadd(int from,int to,ll val)
{edge[cnt].from=from,edge[cnt].to=to,edge[cnt].val=val;edge[cnt].next=head[from];head[from]=cnt++;
}
int main()
{init();scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)map[i][j]=INF;for(int i=1;i<=m;i++){int x,y;ll val;scanf("%d%d%I64d",&x,&y,&val);map[x][y]=min(map[x][y],val);map[y][x]=min(map[y][x],val);   }for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(map[i][j]!=INF&&i!=j)edgeadd(i,j,map[i][j]);for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)map[i][j]=min(map[i][j],map[i][k]+map[k][j]);for(int i=1;i<=n;i++)map[i][i]=0;for(int i=2;i<=n;i++){memset(f,0,sizeof(f));for(int j=1;j<=n;j++){if(j==i)continue;for(int k=head[j];k!=-1;k=edge[k].next){int to=edge[k].to;if(edge[k].val+map[to][i]==map[j][i])f[j]++;}}for(int j=1;j<i;j++){for(int k=1;k<=n;k++){if(map[j][k]+map[k][i]==map[j][i])ans[j][i]+=f[k];}}}for(int i=1;i<=n;i++)for(int j=i+1;j<=n;j++)printf("%I64d ",ans[i][j]);puts("");
}

codeforces 416E President's Path floyd+D(递)P(推)相关推荐

  1. 弗洛伊德算法c语言path,Floyd算法(弗洛伊德算法)

    算法描述: Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法.从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按 ...

  2. hdu 5636 Shortest Path(Floyd最短路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5636 解题思路: 这道题可以用Floyd解决,不过需要特殊处理一下: 实际上我们只需要利用添加的那三条 ...

  3. Codeforces 1327 E. Count The Blocks(递推找规律)

    题意: 给出一个 n n n,求 1 0 n 10^n 10n 内长度为 1 1 1到 n n n的块分别有多少个.块的含义是连续相同数字的长度. 第一眼以为数位 d p dp dp 暴力打表出前几项 ...

  4. vs打开sln是空白_周末惊喜版块 | 新文速递 强推全息网游无限流鬼怪文/软妹身大佬心锦鲤女主VS阴郁暴躁倒霉蛋男主【言情】01.20...

    点点关注,本萝莉就亲亲你目录 <无限求生>作者:轻云淡 [红金] [强推全息网游无限流鬼怪文] <娇宠天成(重生)>作者:沈青鲤 [金] <(仙侠)我是系统>作者: ...

  5. Floyd算法求最短路径(附代码实例)

    Floyd算法 使用范围: 1)求每对顶点的最短路径; 2)有向图.无向图和混合图; 算法思想: 直接在图的带权邻接矩阵中用插入顶点的方法依次递推地构造出n个矩阵D(1), D(2), -, D(n) ...

  6. 【数学建模】图论模型-Floyd算法(最优化)

    文章目录 一.算法介绍 二.适用问题 三.算法总结 1. 步骤 四.应用场景举例 五.MATLAB代码 六.实际案例 七.论文案例片段(待完善) Floyd算法主要针对数学建模问题中的一些小的子问题进 ...

  7. 2019matlab中的floyd,基于matlab的floyd算法详解

    function [d,path]=floyd(a,sp,ep) % floyd   - 最短路问题 % % Syntax: [d,path]=floyd(a,sp,ep) % % Inputs: % ...

  8. 图论模型Floyd算法

    图论模型Floyd算法 一.简介 二.MATLAB执行代码 一.简介 二.MATLAB执行代码 tulun2.m a= [ 0,50,inf,40,25,10;50,0,15,20,inf,25;in ...

  9. 数学建模:图论模型-Floyd算法

    紧接着来介绍一下图论模型的另一种算法--Floyd算法,然后介绍其在MATLAB中的实现方法: Floyd算法:Floyd算法是一个经典的动态规划算法.用通俗的语言来描述的话,首先我们的目标是寻找从点 ...

最新文章

  1. 成本VS用户体验, 服务台互动语音应答(IVR)介绍
  2. K-means聚类自定义距离计算
  3. paradox 修改字段长度_关于生日的作文500字9篇
  4. SpringCloud Zuul(二)之简单用法
  5. 【树莓派学习笔记】八、两步安装VS Code (Visual Studio Code)
  6. python保存模型与参数_基于pytorch的保存和加载模型参数的方法
  7. php.ini 只读,disabled by the php.ini setting phar.readonly
  8. 彩色烟雾一直是许多摄影师和摄影爱好者的首选武器
  9. 多个python脚本同时执行_用shell同时启动多个python脚本
  10. 智能交通——车辆属性识别
  11. M2BEV:采用统一BEV表征的多摄像头联合3D检测分割
  12. android震动代码分析
  13. PTA——互评成绩(c语言)
  14. MySQL用逗号进行拼接、以逗号进行分割
  15. dgesForExtendedLayout ios7新特性
  16. sublimeText3汉化教程-自带插件汉化
  17. java批注_java中批注作用
  18. 解决Mac连接RIOCH(理光)打印机无法打印问题
  19. kubelet运行机制及架构分析
  20. 证件照如何换底色,分享三种证件照换底色的方法!

热门文章

  1. 数据结构学习:哈希表
  2. Nginx 方向代理解决跨域问题-2
  3. 安装anaconda时需要卸载python么_怎么卸载python 安装 anaconda
  4. android plc,基于Android的智能PLC操控软件设计与实现
  5. Debian10 更换软件源 配置中文环境 安装中文输入法
  6. @Android程序员今年必看!!拖更了三年带回了一个抖音,虎牙,哔哩哔哩都在用的库|墙裂推荐
  7. VSTO,PPT插件,C#,文本框TextFrame对象和TextFrame2对象在文本居中上的区别
  8. python小程序——视频篇
  9. 打开Visual Studio Community 2017 报出“许可证已过期”
  10. arr和arr的区别以及数组首元素地址和整个数组地址的区别