main
黄海 2 years ago
parent 905eaec715
commit 2c7ade0483

@ -12,7 +12,7 @@ struct Edge {
bool operator<(const Edge &t) const {
return c < t.c;
}
} edge[M]; // 因为本题需要用链式前向星建图所以避开了使用e做为边的数组名称
} edge[M];
int d1[N][N]; // 从i出发到达j最短距离
int d2[N][N]; // 从i出发到达j次短距离
@ -24,7 +24,6 @@ void add(int a, int b, int c) {
}
// 并查集
int p[N];
int find(int x) {
if (x == p[x]) return x;
return p[x] = find(p[x]);
@ -74,7 +73,6 @@ signed main() {
// Kruskal求最小生成树
for (int i = 0; i < m; i++) {
int a = edge[i].a, b = edge[i].b, c = edge[i].c;
int pa = find(a), pb = find(b);
if (pa != pb) {
p[pa] = pb; // 并查集合并
@ -96,7 +94,7 @@ signed main() {
for (int i = 0; i < m; i++)
if (!edge[i].flag) {
int a = edge[i].a, b = edge[i].b, c = edge[i].c;
if (c > d1[a][b]) // 最小生成树外的一条边,(a-b),如果比最小生成树中a-b的最长边长就有机会参加评选次小生成树。
if (c > d1[a][b]) // 最小生成树外的一条边,(a->b),如果比最小生成树中a->b的最长边长就有机会参加评选次小生成树。
// 最终的选举结果取决于它增加的长度是不是最少的
res = min(res, sum + c - d1[a][b]); // 替换最大边
else if (c > d2[a][b]) // 替换严格次大边

@ -0,0 +1,9 @@
## 换根 $dfs$ 专题
#### [$AcWing$ $1072$ 树的最长路径](https://www.cnblogs.com/littlehb/p/15784687.html)
#### [$AcWing$ $1073$. 树的中心](https://www.cnblogs.com/littlehb/p/15786805.html)
#### [$AcWing$ $1148$ 秘密的牛奶运输](https://www.cnblogs.com/littlehb/p/16054005.html)
Loading…
Cancel
Save