![](https://img-blog.csdnimg.cn/20200823210117437.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
图论——最小生成树
最小生成树
lllllan.
盛意以江河,江河不及你
展开
-
Kruskal算法
最小生成树问题:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。[1]最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。prim是对点贪心,适用于稠密图;kruskal对边进行贪心,代码更简单更高效,但是处理边较多的图复杂度要差一些,所以适用于稀疏图。Kruskal算法对边进行贪心操作。从最短的边开始,把他们加入到T中;在剩下的边中找到最短的边,加入到T中;继续这个过程,直到所有的点都在T中。...原创 2020-07-09 00:55:33 · 188 阅读 · 0 评论 -
Prim算法
最小生成树问题:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。[1]最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。...原创 2020-07-09 00:46:48 · 258 阅读 · 0 评论 -
POJ1287 Networking【最小生成树水题】
Networking题意: 在一个n点m边的无向图中,求最小生成树的权值和题解: 模板题,Prim算法注意一下重边就好模板参考:Prim算法、Kruskal算法Prim#include<algorithm>#include<iostream>#include<cstring>using namespace std;#define _for(i, a, b) for(int i = (a); i <= (b); ++i)const int N原创 2020-11-24 07:40:13 · 102 阅读 · 0 评论 -
次小生成树模板
#include<iostream>#include<algorithm>#include<cstring>using namespace std;#define _for(i, a, b) for(int i = (a); i <= (b); ++i)const int inf = 0x3f3f3f3f;const int N = 110;int n, m;int lowc[N], pre[N];int G[N][N], Max[N][N];原创 2020-11-22 10:17:34 · 79 阅读 · 0 评论 -
POJ1251 Jungle Roads【最小生成树裸题——kruskal】
Jungle Roads裸题不罗嗦#include<algorithm>#include<iostream>#include<cstring>#include<iomanip>#include<cstdio>#include<string>#include<vector>#include<cmath>#include<queue>#include<stack...原创 2020-10-17 18:12:50 · 227 阅读 · 0 评论 -
HDU4126 Genghis Khan the Conqueror——最小生成树+树形DP(⭐)
点这里题意: 给定一个带权无向图G,n个点m条边,每条边都有一个权值w。题目保证两个点之间最多只有一条边。接下来有Q次边权的改变,且改变后的权值之后一定比原来的更大。求每次改变边权之后的所有最小生成树的平均值(边权的改变前后不影响。题解:构造最小生成树: 在没有任何边权改变之前,求出最原始的最小生成树,记录这棵树的权值和ans。边权替换: 再次强调,每次边权的改变,是独立操作、前后互补影响的。明确之后再对改变的边权进行分类讨论:边在树上: 这次改变的边在最原始的最小生成树上,并...原创 2020-09-05 14:36:17 · 145 阅读 · 0 评论 -
HDU4081 Qin Shi Huang‘s National Road System——最小生成树变形(⭐)
点这里题意: 给定n个城市,每个城市都有一个坐标和人数。现要将所有的城市连接起来,花费为两个城市之间的距离。你可以将其中的一条路的花费,变为零,称其为魔法道路。假设A为魔法道路连接的两个城市的总人口,B为在这条魔法道路的基础上,连接所有城市的最小花费;要求输出最大的A / B。题解: 看上去好像是先构造出最小生成树,得到没有魔法道路下的最小花费,然后逐个去删边,去求每种情况下的A和B,最后拿到最大值。整理一下思路构造最小生成树: 构造的是没有魔法道路下的最小生成树,先用Kruskal求...原创 2020-09-04 17:14:11 · 116 阅读 · 0 评论 -
HDU5627 Clarke and MST——最大生成树
点这里题意: 给定一个无向图,含有n个点和m条边,每条边都有一个权值w。要求构造一个生成树,使得树的每条边的权值按位与结果最大。题解: 用Kruskal算法就能轻松解决,只是要将所有边按从大到小的规则排序。#include<bits/stdc++.h>using namespace std;const int N = 3e5 + 10;int T, n, m;int cnt, ans, flag;int s[N];int find(int x){ return...原创 2020-09-04 11:37:24 · 216 阅读 · 0 评论 -
HDU1102 Constructing Roads——prim
点这里题意: 一共有n个村庄,给出每两个村庄间需要修的路的长度。以及给出q条已经修好的路,求最少还要修多少长度的路能使所有村庄连通。题解: prim算法的板子题,详见点这里。#include<bits/stdc++.h>using namespace std;const int N = 110;const int inf = 0x3f3f3f3f;int n, q, a, b, ans;int d[N], vis[N];int G[N][N];int pri...原创 2020-09-04 09:26:37 · 82 阅读 · 0 评论 -
HDU3072 Intelligence System——强连通分量(tarjan缩点+最小生成树)
点这里题意: 给定一个无向图,图中每条边都有一个权值,求将所有强连通分量连接起来的最小权值和。题解: 因为两点强连通的情况下,是不计算权值的,所以题目概括起来就是求链接强连通分量的权值和。所以大体分成两步:tarjan缩点: 同一个强连通分量中是不需要计算权值的,干脆全部合并算了。枚举: 也就十万条边,只要找到某条边,连接着两个不同的强连通分量,就要参与最小权值和的计算。过程中犯的错:求和: 虽然tarjan运行完之后会划分出tot个强连通分量,但是为了让这些分量连接起来只...原创 2020-09-01 13:32:08 · 127 阅读 · 0 评论