路径和(cdq分治)
题目描述
对于一张有向图,定义d(u,v,w)为从u号点出发,不经过v号点,最终到达w号点的最短路径长度。如果不存在这样的路径,d(u,v,w)的值为−1。
你也可以认为d(u,v,w)是删去v点和其相关的边后,图中u到w的最短路。
现在给定这张有向图每两个点之间的有向边的长度(如果不存在连边则为−1),对于所有满足1≤x,y,z≤n,x≠y,y≠z的有序数对(x,y,z),求它们d(x,y,z)的和。
你可以借助样例一解释来理解上面这句话的意思。
输入
第一行输入一个正整数n,表示该地区的点数。
接下来输入n行,每行输入n个整数。第i行第j个数Gi,j表示从i号点到j号的有向路径长度。如果这个数为−1,则表示不存在从i号点出发到j号点的路径。
输出
输出一个整数表示答案。
样例输入
3
0 1 -1
100 0 2
-1 -1 0
样例输出
100
提示
思路
每次分治假设(l,r)的区间为被删去的边,利用cdq分治递推即可得解
代码实现
#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=305;
const int M=1e5+5;
const int INF=0x3f3f3f3f;
const ll LINF=5e18;
const ull sed=31;
const ll mod=19260817;
const double eps=1e-5;
const double PI=acos(-1.0);
typedef pair<int,int>P;
typedef pair<double,double>Pd;template<class T>void read(T &x)
{x=0;int f=0;char ch=getchar();while(ch<'0'||ch>'9') {f|=(ch=='-');ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}x=f?-x:x;return;
}template <typename T> inline void write(T x)
{if(x<0) putchar('-'), x = -x;if(x >= 10) write(x/10);putchar(x%10+'0');
}int n,mp[N][N];ll cal(int l,int r)
{ll ret=0;if(l==r){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(i!=l && j!=l && i!=j){if(mp[i][j]>=INF) ret-=1;else ret+=mp[i][j];}}}return ret;}int tmp[N][N];int mid=(l+r)>>1;memcpy(tmp,mp,sizeof(mp));for(int k=mid+1;k<=r;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);ret+=cal(l,mid);memcpy(mp,tmp,sizeof(mp));for(int k=l;k<=mid;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);ret+=cal(mid+1,r);memcpy(mp,tmp,sizeof(mp));return ret;
}int main()
{//freopen("a.txt","r",stdin);read(n);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){read(mp[i][j]);if(mp[i][j]==-1) mp[i][j]=INF;}}printf("%lld\n",cal(1,n));return 0;
}
路径和(cdq分治)相关推荐
- CF603E-Pastoral Oddities【CDQ分治,可撤销并查集】
正题 题目链接:https://www.luogu.com.cn/problem/CF603E 题目大意 开始时有nnn个点,没有边. 依次加入mmm条带权的边,每次加入后询问是否存在一个边集,满足每 ...
- 2021牛客暑期多校训练营3 G-Yu Ling(Ling YueZheng) and Colorful Tree(cdq分治)
G-Yu Ling(Ling YueZheng) and Colorful Tree HOWARLI题解 大致做法就是首先考虑哪些修改可能影响询问,当修改点权是询问的倍数时才可能影响询问.于是考虑把他 ...
- BZOJ 4285 使者 (CDQ分治+dfs序)
题目传送门 题目大意:给你一棵树,有三种操作,在两个点之间连一个传送门,拆毁一个已有的传送门,询问两个点之间的合法路径数量.一条合法路径满足 1.经过且仅经过一个传送门 2.不经过起点终点简单路径上的 ...
- 点分治+CDQ分治+整体二分全纪录
点分治 点分治讲解 解决树上路径问题 经典例题:点分治(长度小于m的路径计数) 经典例题:点分治(聪聪可可) 经典例题:点分治(多个定值路径计数) 经典例题:点分治(采药) 经典例题:点分治+ST表+ ...
- 【BZOJ3456】【CDQ分治+FNT】城市规划
试题来源 2013中国国家集训队第二次作业 问题描述 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了. 刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一些贸易路线, 使得 ...
- BZOJ 1176[Balkan2007]Mokia (cdq分治,矩阵加矩阵求和)
BZOJ 1176[Balkan2007]Mokia (cdq分治,矩阵加矩阵求和) Description 维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值. ...
- 【BZOJ-3456】城市规划 CDQ分治 + NTT
题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=3456 Solution 这个问题可以考虑dp,利用补集思想 N个点的简单图总数量为$2^{ ...
- BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )
考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ...
- bzoj2961 共点圆 (CDQ分治, 凸包)
/* 可以发现可行的圆心相对于我们要查询的点是在一个半平面上, 然后我们要做的就是动态维护凸壳然后用这个半平面去切它 看看是否是在合法的那一面然后cdq分治就可以了代码基本是抄的,*/#include ...
最新文章
- 开发系统平台常用的-MVC设计模式简介
- Golang入门教程(十七)Linux/Windows下快速搭建和配置NSQ
- MySQL 数据库常用命令小结
- Android——Activity去除标题栏和状态栏
- 汽车电子专业知识篇(九)-charge pump的原理介绍
- mysql 5.7.20 win64_Win10下MySQL5.7.20 Mysql(64位)解压版安装及bug修复
- ajax常见的status状态码
- 预约挂号费用保险赔吗?
- python适用于哪些芯片_这些鲜为人知的Python功能,你值得拥有!
- oracle连接ORA-01017、ORA-12640
- vue element-plus 插件
- ArcGIS Pro 中检查尖锐角步骤
- 关于学习Android的三个终极问题
- 计算机是否能安装64位操作系统,电脑装32位还是64位系统
- 光耦应用电路设计方法
- SpringBoot官方开发工具,热部署和远程调试真带劲
- 算法思想理解系列 -- 检索排序学习之pairwise类型
- 机器学习笔记 - 学习朴素贝叶斯概念及应用
- mysql 日期查询下周,MySQL时间函数的使用:查询本周、下周、本月、下个月份的数据【转】...
- 汽车维修管理系统C语言代码,大智慧汽车维修管理系统
热门文章
- IO模型(阻塞,非阻塞,多路复用)
- 微信公众平台接口测试帐号申请流程
- 系统的频域分析法-----Chap4_5-8
- w500 安装mac
- 为啥说外包公司不能去?
- 大数据挖掘永恒的定律?符号回归(Symbolic Regressor)
- 汽车鸿蒙音响怎么调,汽车音响怎么调试 汽车音响调试步骤方法【详细介绍】...
- win7摄像头软件_5款用起来超爽的Windows高效软件
- Carsim与Simulink联仿Carsim找不到Matlab错误的解决方案,此前装过多个Matlab版本出现该问题可以尝试此方法
- 如何重启 php-fpm