摘要: 因为边权都是 1 ,直接可以用BFS来求最短路 在BFS的过程中,如果当前层可以由上一层转化过来,就进行计数 #include <bits/stdc++.h> using namespace std; const int N = 1e6 + 10,M = 2e6 + 10,mod = 100003; 阅读全文
posted @ 2020-06-21 21:12 lukelmouse 阅读(56) 评论(0) 推荐(0) 编辑
摘要: 建一个正向图和反向图,(都存到一个地方,反向图的节点加 n 就好了),跑两边 Dijskra #include <bits/stdc++.h> using namespace std; const int N = 1e3 + 10,M = 1e5 + 10,INF = 0x3f3f3f3f; typ 阅读全文
posted @ 2020-06-21 18:30 lukelmouse 阅读(73) 评论(0) 推荐(0) 编辑
摘要: Floyd算法深刻理解 最开始只允许经过1号顶点进行中转,接下来只允许经过1和2号顶点进行中转……允许经过1~n号所有顶点进行中转,求任意两点之间的最短路程。用一句话概括就是:从i号顶点到j号顶点只经过前k号点的最短路程。 因为给的时间是不下降的序列,所以肯定要从第一个村庄开始修路,这样用时间来判断 阅读全文
posted @ 2020-06-21 17:45 lukelmouse 阅读(45) 评论(0) 推荐(0) 编辑
摘要: 分成两部 求出树的重心 用$BFS$ 求出所有点到重心的距离 #include <bits/stdc++.h> using namespace std; const int N = 5e4 + 10; int e[N*2],ne[N*2],h[N],idx,rt,mds[N],ds[N],n,sum 阅读全文
posted @ 2020-06-21 11:53 lukelmouse 阅读(66) 评论(0) 推荐(0) 编辑
摘要: 求重心的本质,其实就是枚举每一个节点的所有子树,使得该节点中的最大子树最小化。 #include <iostream> #include <cstring> using namespace std; const int N = 2e5 + 10; int e[N],h[N],ne[N],mds[N] 阅读全文
posted @ 2020-06-21 11:33 lukelmouse 阅读(82) 评论(0) 推荐(0) 编辑