首页 > 其他分享 >最小生成树

最小生成树

时间:2023-08-05 19:55:25浏览次数:43  
标签:prim int ed 最小 生成 INF dis

1.prim

每次循环都访问一个点,并将此点所有边找到其最小的边权,如果最小边权对应的点没有被访问过,则加入队列。这相当于向生成树中添加了n-1条最小边,最后检查所有点的连通性,联通的话得到的就是最小生成树,属于贪心算法。

暴力贪心的话复杂度为o(n²),这边采用堆优化的方法,时间复杂度o(mlogn)

 1 const int N = 2e5 + 10, INF = 0x3f3f3f3f3f3f3f3f;
 2 int dis[N];
 3 bool vis[N];
 4 int n, m, sum;
 5 vector<pair<int, int>> vt[N];
 6 priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int,int>>> q;
 7 int prim(int pos) {
 8     int ans = 0;
 9     int cnt = 0;
10     q.push(make_pair(0, pos));
11     while (!q.empty() && cnt <= n) {
12         int x = q.top().first;
13         int y = q.top().second;
14         q.pop();
15         if (vis[y])continue;
16         vis[y] = true;
17         ans += x; cnt++;
18         for (auto it : vt[y])
19             if (!vis[it.first])
20                 q.push(make_pair(it.second, it.first));
21     }
22     return ans;
23 }
24 void solve() {
25     cin >> n >> m;
26     memset(dis, INF, sizeof(dis));
27     for (int i = 1; i <= m; i++) {
28         int u, v, w;
29         cin >> u >> v >> w;
30         vt[u].push_back(make_pair(v, w));
31         vt[v].push_back(make_pair(u, w));
32     }
33     int value = prim(1);
34     int flag = 0;
35     for (int i = 1; i <= n; i++)
36         if (!vis[i])flag = 1;
37     if (value >= INF || flag)cout << "orz" << endl;
38     else cout << value << endl;
39 }

跟最短路的代码有些相似。

2、kruskal

将所有边进行排序后利用并查集将点连成一个集合,最后检查一下所有点是否在同一个集合内,是的话则输出最小生成树。

 1 const int N = 2e5 + 10, INF = 0x3f3f3f3f3f3f3f3f;
 2 int f[N];
 3 int n, m, sum;
 4 struct edge {
 5     int u, v, w;
 6 }ed[N];
 7 void start() {
 8     for (int i = 1; i <= n; i++)f[i] = i;
 9 }
10 bool cmp(edge k, edge l) {
11     return k.w < l.w;
12 }
13 int find(int x) {
14     if (x == f[x])return x;
15     f[x] = find(f[x]);
16     return f[x];
17 }
18 int kruskal() {
19     int ans = 0;
20     int cnt = 0;
21     for (int i = 1; i <= m; i++){
22         int fu = find(ed[i].u);
23         int fv = find(ed[i].v);
24         if (fu != fv) {
25             f[fu] = fv;
26             ans += ed[i].w;
27             cnt++;
28         }
29         if (cnt == n - 1)return ans;
30     }
31     return -1;
32 }
33 void solve() {
34     cin >> n >> m;
35     start();
36     for (int i = 1; i <= m; i++)
37         cin >> ed[i].u >> ed[i].v >> ed[i].w;
38     sort(ed + 1, ed + 1 + m, cmp);
39     int temp = kruskal();
40     int cnt = 0;
41     for (int i = 1; i <= n; i++)
42         if (f[i] == i)cnt++;
43     if (cnt > 1)temp = -1;
44     if (temp != -1)cout << temp << endl;
45     else cout << "orz" << endl;
46 }

 

标签:prim,int,ed,最小,生成,INF,dis
From: https://www.cnblogs.com/DLSQS-lkjh/p/17608510.html

相关文章

  • ChatGenTitle:使用百万arXiv论文信息在LLaMA模型上进行微调的论文题目生成模型
    ChatGenTitle:使用百万arXiv论文信息在LLaMA模型上进行微调的论文题目生成模型相关信息1.训练数据集在Cornell-University/arxiv,可以直接使用;2.正式发布LLaMa-Lora-7B-3和LLaMa-Lora-7B-3-new版本的LoRA模型权重,允许本地部署使用;完成了基于alpaca-lora上进行的LLaMa......
  • 最小割树 学习笔记
    最小割树(Gomory-HuTree)是一种可以在\(O(Vf)\)的时间里求出一个图中全源最小割的算法,其中\(f\)为一次最大流的时间。记原图为\(G=(V,E)\),其最小割树为\(G'=(V,E')\).在最小割树中,任两点间的最小割等于它们在原图中的最小割,且\(\forall(u,v)\inE'\),\(E'\setminus\{u......
  • 最小生成树/二分图
    最小生成树Prim算法朴素版PrimO(n^2)稠密图步骤:S:表示最小生成树的集合初始化距离找距离集合S最近的节点将节点加入集合S用该节点更新非S点到集合S点的距离代码:constintN=510;constintINF=0x3f3f3f3f;intg[N][N];intd[N];//非生成树节点与生成树......
  • SQL-去除最大值与最小值求均值的问题
    背景今天有同事问我一道关于数据库SQL的面试题,我刚开始随便给了一个思路,后来思索发现这个思路有漏洞,于是总结下来,仅供参考。问题:薪水表中是员工薪水的基本信息,包括雇员编号,和薪水,查询除去最高、最低薪水后的平均薪水。一、薪水表信息CREATETABLE`salaries`(`emp_n......
  • 最大流 最小割
    网络流的一些定义和性质1.流网络(FlowNetwork)流网络为一个有向图\(G=(V,E)\),所有边\((u,v)\inE\)都有一个容量(Capacity),用\(c(u,v)\)表示。另外规定了两个点:源点(Source)、汇点(Sink),分别为\(s\)和\(t\quad(s\neqt)\)2.流定义流量为\(f(u,v)\)为\(V\timesV......
  • 论文解读:《利用生成性深度学习预测用于DNA编辑的设计者重组酶》》
    期刊:naturecommunications影响因子:16.6↓1.094中科院分区:1区摘要位点特异性酪氨酸型重组酶是基因组工程的有效工具,首个工程化变体已显示出治疗潜力。到目前为止,设计重组酶对新DNA靶位点选择性的适应主要是通过定向分子进化的迭代循环实现的。虽然有效,定向分子进化方法是费力和耗......
  • 8-5|生成一个纯色的ico图片
    fromPILimportImagedefcreate_solid_color_ico(color,size,file_path):  """  生成一个纯色的ICO图像。  参数:    color(tuple):RGB颜色值,例如(255,0,0)表示红色。    size(tuple):图像尺寸,例如(32,32)表示32x32的图像。 ......
  • G4、CGAN|生成手势图像——可控制生成
    ......
  • OCR深度实践系列:数据生成
    转载:https://mp.weixin.qq.com/s?__biz=MzI5MjYzNzAyMw==&mid=2247484187&idx=1&sn=549b68ec989792ad5e2fb9179af55598&chksm=ec7f132bdb089a3d2f96ebecc780a6e756cdf26cb4e8a5bc4951c029e0c4dfb83c40cdc927ff&scene=21#wechat_redirect(一)图像预处理这篇为OCR深度实......
  • go随机生成token
    const(defaultTokenLenint=16)funcGenerateToken()string{rand.Seed(time.Now().UnixNano())runes:=[]rune("abcdefghijklmnopqrstuvwxyz0123456789")b:=make([]rune,defaultTokenLen)fori:=rangeb{b[i]=r......