题目大意


题目大意:


解题思路:

  1. 首先我们肯定先把任意两个点之间的最短路求出来→Floyed\rightarrow Floyed→Floyed最短路算法
  2. 现在我们假设只固定两个点x,yx,yx,y去求解答案。
  3. 首先我们发现的是xxx和yyy之间一定要是最短路,如果有多条最短路怎么办?
  4. 这肯定是不存在答案的!!因为这个路径最多有一条在树上面,但是对于另外的路径上面的点,肯定不满足最优了,因为你yyy要经过xxx,或者xxx要经过yyy去链接里面的点,肯定不是最短路了那么就是有多条最短路答案肯定是0
  5. 对于xxx和yyy路径上面的点肯定是只有一种选择了d[x][v]+d[v][y]=d[x][y]d[x][v]+d[v][y]=d[x][y]d[x][v]+d[v][y]=d[x][y]
  6. 假如不是xxx和yyy路径上面点怎么求解呢?
  7. 首先我一开始是这么想的d[x][v]=d[x][y]+d[y][v]ord[y][v]=d[y][x]+d[x][v]d[x][v]=d[x][y]+d[y][v]\;\text{or}\;d[y][v]=d[y][x]+d[x][v]d[x][v]=d[x][y]+d[y][v]ord[y][v]=d[y][x]+d[x][v]但是这个公式没有体现出路径出来?
  8. 一条路径是两个点确定的,那么我们就在引入一个额外的点v′v'v′
  9. 那么公式就变成d[x][v]=d[x][v′]+1&&d[y][v]=d[y][v′]+1d[x][v]=d[x][v']+1\&\&d[y][v]=d[y][v']+1d[x][v]=d[x][v′]+1&&d[y][v]=d[y][v′]+1
  10. 我们知道最短路径树是上每个点到xxx和yyy都是最短路,假如我们固定xxx为根的时候,每个点所在树的层次就会固定下来了


11. 不同的树是因为每一层之间的链接方式不一样
12. 我们看上面的枚举的v′v'v′和vvv刚好就是相邻两层之间的点。
13. 因为每次点之间都是独立去链接的,那么我们对于每个vvv我们可以枚举周围的点看有多少个点v′v'v′满足上面的公式,假设是curvcur_vcurv​。然后我们用乘法原理相乘就好了
14. ansx,y=∏curvans_{x,y}=\prod_{} cur_vansx,y​=∏​curv​


AC code

O(n2∗m)O(n^2*m)O(n2∗m)

#include <bits/stdc++.h>
#define mid ((l + r) >> 1)
#define Lson rt << 1, l , mid
#define Rson rt << 1|1, mid + 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define log2(a) log(a)/log(2)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define LLF 0x3f3f3f3f3f3f3f3f
#define f first
#define s second
#define endl '\n'
using namespace std;
const int N = 2e6 + 10, mod = 998244353;
const int maxn = 500010;
const long double eps = 1e-5;
const int EPS = 500 * 500;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
typedef pair<double,double> PDD;
template<typename T> void read(T &x) {x = 0;char ch = getchar();ll f = 1;while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}
template<typename T, typename... Args> void read(T &first, Args& ... args) {read(first);read(args...);
}
vector<int> G[500];
int d[500][500], ans[500][500];
int n, m;
inline void init() {for(int i = 1; i <= n; ++ i) d[i][i] = 0;for(int i = 1; i <= n; ++ i)for(int j = 1; j <= n; ++ j)for(int k = 1; k <= n; ++ k)d[j][k] = min(d[j][k],d[j][i]+d[i][k]);
}
int main() {IOS;ms(d,INF);cin >> n >> m;for(int i = 1; i <= m; ++ i) {int u, v;cin >> u >> v;G[u].push_back(v);G[v].push_back(u);d[u][v] = d[v][u] = 1;}init();for(int i = 1; i <= n; ++ i)for(int j = i; j <= n; ++ j) {bool ok = true;vector<int>pos(d[i][j] + 1,-1);for(int k = 1;k <= n;k++) {if(d[i][k] + d[k][j] == d[i][j]) {if(pos[d[i][k]] != -1) {ok = false;break;}pos[d[i][k]] = k;}}if(!ok) continue;int cur = 1;for(int k = 1;k <= n;k++) {if(d[i][k] + d[k][j] > d[i][j]) {int cnt = 0; //代表bfs tree中能到点k的边数for(int e = 0;e < G[k].size();e++) {int v = G[k][e];if(d[i][v] + 1 == d[i][k] && d[j][v] + 1 == d[j][k]) cnt++;}cur = 1ll * cur * cnt % mod;}}ans[i][j] = ans[j][i] = cur;}   for(int i = 1;i <= n;i++) {for(int j = 1;j <= n;j++) {printf("%d ",ans[i][j]);}printf("\n");}return 0;
}

图论 ---- CF1495D .BFS Trees(图论最短路生成树+枚举计数+树的层次性)相关推荐

  1. 2022蓝桥杯学习——6.双指针、BFS和图论

    一.双指针 关于双指针 核心思想就是优化!! 双指针只用一层循环,虽然里面是while,但j只执行了n次,所以ij一共就是2n,时间复杂度就是O(n) , 这种题一般先写出暴力算法,然后看单调性,如果 ...

  2. 蓝桥杯备赛(五) 双指针,BFS与图论

    蓝桥杯备赛(五) 双指针,BFS与图论 一.双指针 1.Acwing 1238. 日志统计 小明维护着一个程序员论坛.现在他收集了一份"点赞"日志,日志共有 N 行. 其中每一行的 ...

  3. 【图论——第一讲】图论基础以及图的储存

    ฅ(๑˙o˙๑)ฅ 大家好, 欢迎大家光临我的博客:面向阿尼亚学习算法学习笔记系列持续更新中~ 文章目录 一.前言 推荐大家一个图形编译器[很好用](https://csacademy.com/app ...

  4. 计算机专业常用图论,计算机专业研究生图论课程探讨.doc

    计算机专业研究生图论课程探讨 计算机专业研究生图论课程探讨 摘要:本文根据计算机专业硕士研究生的具体情况结合图论课程自身的特点,以作者多年讲授这门课程的经验,立足于同学们以后的学习和工作,对图论课程的 ...

  5. 生成树的计数 Matrix-Tree(矩阵树)定理

    信息学竞赛中,有关生成树的最优化问题如最小生成树等是我们经常遇到的,而对生成树的计数及其相关问题则少有涉及.事实上,生成树的计数是十分有意义的,在许多方面都有着广泛的应用.本文从一道信息学竞赛中出现的 ...

  6. 第六讲 双指针、BFS与图论、单链表

    双指针 所有类似这样的算法都是双指针算法,时间复杂度为O(n) AcWing 1238. 日志统计 小明维护着一个程序员论坛.现在他收集了一份"点赞"日志,日志共有 N 行. 其中 ...

  7. 【图论专题】单源最短路的扩展应用

    题目列表: 题目 算法 AcWing 1137. 选择最佳线路 最短路+超级源点 AcWing 1131. 拯救大兵瑞恩 拆点建图+思维+双端队列BFS+状态压缩 AcWing 1134. 最短路计数 ...

  8. 【图论专题】单源最短路的综合应用

    单源最短路径经常与DFS.DP.二分.拓扑排序等算法的结合使用. 题目列表: 题目 算法 AcWing 1135. 新年好 最短路+DFS AcWing 340. 通信线路 二分+双端队列BFS Ac ...

  9. 专题三:bfs、图论专题(1.cf)

    其他 挑战程序设计竞赛 1.POJ 3259 Wormholes 这道题后来我又想了一个方法,只能说这个方法不是完全正确,还要因题而定.为什么这么说呢?我用的是Bellman-Ford找负圈,可以这么 ...

最新文章

  1. 创建一个打不开删不掉的文件夹
  2. pdfminer3k 官方文档_IPFS官方周报112期
  3. 【HTML5】页面点击按钮添加一行 删除一行 全选 反选 全不选
  4. jquery插件:图片截取工具jquery.imagecropper.js
  5. NoSQL Redis的学习笔记
  6. Python处理各种压缩文件(bzip2,gzip,zip)
  7. kotlin 反射java类_Android Kotlin的Class、反射、泛型
  8. Matlab图像处理应用举例2
  9. Java 反射:Classes
  10. linux用命令启动达梦数据库,达梦数据库DM7的命令行安装
  11. qq linux五笔输入法下载官网,【qq五笔官方下载】qq五笔输入法官方下载电脑版 最新版-开心电玩...
  12. 红米6pro刷Android原生,红米6 Pro 魔趣OS 安卓9 MagiskV21版 完美ROOT 纯净完美 原生极简 纯净推荐...
  13. (Applied Intelligence-2022)TransGait: 基于多模态的步态识别与集合Transformer
  14. 苹果XS怎么截屏_iPhoneXR 到底怎么样?真香 还是真烂?
  15. 简单的图形识别python
  16. CSS 文字背景水印
  17. 直接耦合的互补输出级
  18. 机房管理系列之电话交换机
  19. 关于.length和.length()
  20. CVTE 2021 春招面经

热门文章

  1. 汇编语言中带点/小数点的是什么
  2. 网络工程师_记录的一些真题_2016下半年上午
  3. ACMNO.7 输入两个正整数m和n,求其最大公约数和最小公倍数。 输入 两个整数 输出 最大公约数,最小公倍数 样例输入 5 7 样例输出 1 35
  4. 如何在 Python 中开始机器学习?(小白必看)
  5. 算法工程师面试必考项:二叉树
  6. 《30天吃掉那只 TensorFlow2.0 》(附下载)
  7. 红外线可程序化?遥控器Motedem控制自家居住环境
  8. FBI很气愤:黑了CIA的熊孩子又回来了
  9. 99_leetcode_Best Time to Buy and sell Stock
  10. CoreAnimation —— CATransaction(隐式动画)