最小生成树拓展应用

文章目录

  • 最小生成树拓展应用
      • 理论基础
    • 题单
        • 1. [新的开始](https://www.acwing.com/problem/content/1148/)
        • 2. [北极通讯网络](https://www.acwing.com/problem/content/1147/)
        • 3. [走廊泼水节](https://www.acwing.com/problem/content/348/)
        • 4. [秘密的牛奶运输](https://www.acwing.com/problem/content/1150/)

最小生成树拓展应用

  • 虚拟源点
  • kruskal拓展
  • 次小生成树

理论基础

  1. 任意一棵最小生成树一定可以包含无向图中权值最小的边
  2. 给定一张无向图 G = ( V , E ) , n = ∣ V ∣ , m = ∣ E ∣ G=(V,E),n=|V|,m=|E| G=(V,E),n=V,m=E,从E中选出k<n-1条边构成G的加一个生成森林。若再从剩余的m-k条边中选n-1-k条边添加到生成森林中,使其成为G的生成树,并且选出的边的权值之和最小。则该生成树一定可以包含m-k条边中连接生成森林的两个不连通接节点的权值最小的边

题单

1. 新的开始

第一眼:

  • 要么和其他矿井建立电网共用一个发电站,要么自建发电站
  • 只有当自建站比建电网费用要小时,才自建站
  • 把自环也当成一条边放进去sort,当用不到点时就结束?
  • 已经有电力供应的也可以给其他供应,意思就是进入了生成树就具有供电能力,因此不用担心加进来的边是那个点拉进来的

思考:

感觉是可以prim算法的

  • 为什么prim要过还得有 g [ j ] [ i ] = m i n ( g [ j ] [ i ] , v ) g[j][i]=min(g[j][i],v) g[j][i]=min(g[j][i],v),一篇ac题解

小试牛刀,没过

听y话:

建立一个超级源点,可以解决从哪个点开始的问题,如果只选最小点开始,会把其他自环(也应当看成一条边)忽略而没考虑到

#include<bits/stdc++.h>using namespace std;
const int N=310,INF=0x3f3f3f3f;
int g[N][N],v[N],d[N],st[N];
int res,n;void prim(int s){memset(d,0x3f,sizeof d);d[s]=g[s][s];for(int i=1;i<=n;i++){int t=-1;for(int j=1;j<=n;j++){if(!st[j]&&(t==-1||d[t]>d[j])){t=j;}}st[t]=1;//cout<<t<<","<<d[t]<<' ';res+=d[t];for(int j=1;j<=n;j++) d[j]=min(d[j],g[t][j]);}
}signed main(){cin>>n;//memset(g,0x3f,sizeof g);int minx=INF,mindex=0;for(int i=1;i<=n;i++){cin>>g[i][i];for(int j=1;j<=n;j++){g[j][i]=min(g[j][i],g[i][i]);}if(minx>g[i][i]){mindex=i;minx=g[i][i];}}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){int x;cin>>x;if(i!=j) g[i][j]=x;}}prim(mindex);//cout<<endl;cout<<res<<endl;return 0;
}

手搓建立一个超级源点,ac了,prim算法

#include<bits/stdc++.h>using namespace std;
int n;
const int N=310;
int g[N][N],st[N],d[N];
int res;int prim(){memset(d,0x3f,sizeof d);d[0]=0;for(int i=0;i<=n;i++){int t=-1;for(int j=0;j<=n;j++){if(!st[j]&&(t==-1||d[t]>d[j])){t=j;}}st[t]=1;res+=d[t];for(int j=0;j<=n;j++) d[j]=min(d[j],g[t][j]);}
}signed main(){cin>>n;for(int i=1;i<=n;i++){int x;cin>>x;g[0][i]=g[i][0]=x;}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){cin>>g[i][j];}}prim();cout<<res<<endl;return 0;
}
2. 北极通讯网络

第一眼:

  • 加了k限制的最小生成树,能不能用一个变量去计数呢?
  • 挺复杂的一道题,看的第一遍没懂

听y讲:

  • 涉及到通信问题——”中转“,卫星通信(有限),无线收发器(无限)
  • 用并查集就不需要二分了

思考:

  • 要找到最小的d,那一定是先让小边进入kruskal
  • 关于连通块的问题
    • 并查集
    • bfs和dfs有联想到
  • 有点明白,因为这道题一开始并没有直接相连的点,所有点都是独立的,我们要去找最小生成树的话,在本题用kruskal的时候,枚举一次,连通块的个数就会减一
  • 找到第一个能让剩余连通块个数小于等于k的边就行了

版本一过啦,烙铁~

#include<bits/stdc++.h>using namespace std;
#define x first
#define y second
typedef pair<int,int> PII;
const int N=510,M=N*N;
PII dian[N];
int fa[N];
int n,k;double get_dis(PII a,PII b){double dx=a.x-b.x;double dy=a.y-b.y;return sqrt(dx*dx+dy*dy);
}struct edge{int x,y;double z;bool operator<(const edge& M)const{return z<M.z;}
}e[M];int find(int x){if(x!=fa[x]) fa[x]=find(fa[x]);return fa[x];
}signed main(){cin>>n>>k;for(int i=1;i<=n;i++) fa[i]=i;for(int i=1;i<=n;i++){int x,y;cin>>x>>y;dian[i]={x,y};}int cnt=0;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){double dist=get_dis(dian[i],dian[j]);e[cnt++]={i,j,dist};}}sort(e,e+cnt);int count=n;double res=0;for(int i=0;i<cnt;i++){int a=e[i].x,b=e[i].y;double c=e[i].z;a=find(a),b=find(b);if(a!=b){fa[a]=b;res=c;count--;}if(count<=k){break;}}printf("%.2f\n",res);return 0;
}
3. 走廊泼水节

第一眼:

  • 何为完全图(俩俩之间有边就是完全图)image-20240627183647506
  • 求的是增加的,而不总的,好像可以kruskal解决,但是得知道完全图是什么意思

听y说:

  • 按照什么样的顺序连接能够得到最小值
  • 新边 < w i w_i wi ❌——》不满足生成树定义
  • 新边 = w i w_i wi ❌——》要求生成树唯一

思考:

  • 关于 新边 〉= w i + 1 w_i+1 wi+1 为什么构造的生成树一定是唯一的
    • 因为你要求最小生成树,如果 w i + 1 w_i+1 wi+1 不唯一,那就意味着有 w i w_i wi可以被添加到里面去,那求的原来的生成树就不是最小生成树了,和原树是一个最小生成树矛盾。
  • 怎么把两个集合的所有点连起来
    • 用并查集维护各连通块点的个数
  • 优质题解image-20240628004028620
#include<bits/stdc++.h>using namespace std;
int n;
const int N=6e3+10,M=N*N;
int fa[N],psize[N];struct edge{int x,y,z;bool operator<(const edge& M)const{return z<M.z;}
}edges[M];int find(int x){if(x!=fa[x]) fa[x]=find(fa[x]);return fa[x];
}signed main(){int t;cin>>t;while(t--){cin>>n;for(int i=1;i<=n;i++) fa[i]=i,psize[i]=1;for(int i=0;i<n-1;i++){int a,b,c;cin>>a>>b>>c;edges[i]={a,b,c};}sort(edges,edges+n-1);int res=0;for(int i=0;i<n-1;i++){int a=find(edges[i].x),b=find(edges[i].y),c=edges[i].z;if(a!=b){res+=((psize[a]*psize[b]-1)*(c+1));//因为是还需要多少边,所以原本存在的c不用加psize[b]+=psize[a];fa[a]=b;}}cout<<res<<endl;}return 0;
}
4. 秘密的牛奶运输

第一眼:

  • 又是奶牛,又是usaco
  • 费用第二小怎么搞次最小生成树
  • 费用第二严格大于费用最小,距离z代表着成本

思考:

  • 可不可以找到最小生成树的后一条边(这个边需要满足能生成树)当作答案?

  • 啥玩意image-20240628005813618

听y说:

  • image-20240628012126169
  • 注意总长度会爆int,要开long long
#include<bits/stdc++.h>#define int long long 
using namespace std;
int n,m;
const int N=510, M=1e4+10;
int fa[N],d1[N][N],d2[N][N];
//d1存储的是两点之间路径的最长的边
//d2存储的是两点之间路径的次长的边
int h[N],e[2*N],ne[2*N],w[2*N],idx;
//因为是树的结构,可以看成每个点最多有两个子节点void add(int a,int b,int c){e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}struct edge{int x,y,z;bool f;bool operator<(const edge& M)const{return z<M.z;}
}es[M];int find(int x){if(x!=fa[x]) fa[x]=find(fa[x]);return fa[x];
}//d1,d2形式参数的类型是一维数组,而实参穿的也是一维数组的地址
void dfs(int u,int father,int dmax1,int dmax2,int d1[],int d2[]){d1[u]=dmax1,d2[u]=dmax2;for(int i=h[u];~i;i=ne[i]){int j=e[i];if(j!=father){int td1=dmax1,td2=dmax2;if(w[i]>td1) td2=td1,td1=w[i];else if(w[i]<td1&&w[i]>td2) td2=w[i];dfs(j,u,td1,td2,d1,d2);}}
}signed main(){cin>>n>>m;memset(h,-1,sizeof h);//memset(d1,0x3f,sizeof d1);//memset(d2,0x3f,sizeof d2);for(int i=1;i<=n;i++) fa[i]=i;for(int i=0;i<m;i++){int x,y,z;cin>>x>>y>>z;es[i]={x,y,z};}sort(es,es+m);//求最小生成树int sum=0;for(int i=0;i<m;i++){int a=es[i].x,b=es[i].y,c=es[i].z;int pa=find(a),pb=find(b);if(pa!=pb){fa[pa]=pb; //这里需要找到各自的父节点然后再创建连接sum+=c;add(a,b,c),add(b,a,c);es[i].f=true;}}//以每个点为根找到其与其他点之间的最远距离?for(int i=1;i<=n;i++) dfs(i,-1,-1e9,-1e9,d1[i],d2[i]);//debug dfs找任意两点之间路径最长边和次长边//for(int i=1;i<=n;i++){//    cout<<i<<":"<<endl;//    int k=h[i];//    for(int j=k;~j;j=ne[j]){//        cout<<e[j]<<","<<d1[i][e[j]]<<","<<d1[i][e[j]]<<" ";//    }//    cout<<endl;//}//为什么debug代码打完就过了?int res=1e18;for(int i=0;i<m;i++){bool f=es[i].f;int a=es[i].x,b=es[i].y,c=es[i].z;if(!f){if(c>d1[a][b])res=min(res,sum+c-d1[a][b]);else if(c>d2[a][b]){res=min(res,sum+c-d2[a][b]);}}}cout<<res<<endl;return 0;
}

后台测试样例

4 4
1 2 1
2 3 2
3 4 1
2 4 25

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/36991.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用英文介绍芝加哥(1):Making Modern Chicago Part 1 Building a Boomtown

Making Modern Chicago | Part 1: Building a Boomtown Link: https://www.youtube.com/watch?vpNdX0Dm-J8Y&listPLmSQiOQJmbZ7TU39cyx7gizM9i8nOuZXy&index4 Summary Summary of Chicago’s History and Development Urban Planning and Growth Chicago, often r…

无需向量量化的自回归图像生成

摘要 https://arxiv.org/pdf/2406.11838 传统观点认为&#xff0c;用于图像生成的自回归模型通常伴随着向量量化的标记。我们观察到&#xff0c;尽管离散值空间可以方便地表示分类分布&#xff0c;但它对于自回归建模来说并不是必需的。在这项工作中&#xff0c;我们提出使用扩…

战地战地风云最强的免费加速器 2024低延迟不卡顿加速器推荐

来喽来喽&#xff0c;steam夏季促销它又来喽&#xff0c;战地风云&#xff0c;第一人称射击游戏&#xff0c;而且这次迎来了史低&#xff0c;游戏背景设定为近未来&#xff08;公元2042年&#xff09;&#xff0c;会有动态的天气系统&#xff0c;以及改善后的破坏系统。该作为《…

开源模型应用落地-FastAPI-助力模型交互-WebSocket篇(三)

一、前言 使用 FastAPI 可以帮助我们更简单高效地部署 AI 交互业务。FastAPI 提供了快速构建 API 的能力,开发者可以轻松地定义模型需要的输入和输出格式,并编写好相应的业务逻辑。 FastAPI 的异步高性能架构,可以有效支持大量并发的预测请求,为用户提供流畅的交互体验。此外,F…

关于Mac mini 10G网口的问题

问题: 购入一个10G网口的Mac mini M2&#xff0c;将其和自己的2.5G交换机连接&#xff0c;使用共享屏幕进行远程操作的过程中出现了频率极高的卡顿&#xff0c;几乎是几秒钟卡一下&#xff0c;使用ping进行测试发现卡的时候就ping不通了。测试使用Mac mini的无线网和雷电转2.5G…

React Native 开发常见问题及注意事项

本文只是使用时积累的一些经验 开发环境 1、Android Studio 依赖项下载慢 如果发现依赖下载非常慢&#xff0c;动不动十几KB的 参考&#xff1a;加速 Android Studio 依赖项下载 也可以切换数据源 修改 android/build.gradle中的jcenter()和google() repositories {// goo…

人脑计算机技术与Neuroplatform:未来计算的革命性进展

引言 想象一下&#xff0c;你在某个清晨醒来&#xff0c;准备开始一天的工作&#xff0c;而实际上你的大脑正作为一台生物计算机的核心&#xff0c;处理着大量复杂的信息。这并非科幻电影的情节&#xff0c;而是人脑计算机技术即将带来的现实。本文将深入探讨FinalSpark公司的…

选择适合你的8款原型设计工具

随着互联网的飞速发展&#xff0c;设计行业逐渐成为近年来的热门职业。设计师们需要的掌握的技能也越来越多&#xff0c;例如海报设计、名片设计、产品设计、网页设计等。产品原型设计就是产品设计中非常重要的一个阶段&#xff0c;主要目的是帮助用户更容易了解产品设计的思路…

深度学习 —— 1.单一神经元

深度学习初级课程 1.单一神经元2.深度神经网络3.随机梯度下降法4.过拟合和欠拟合5.剪枝、批量标准化6.二分类 前言 本套课程仍为 kaggle 课程《Intro to Deep Learning》&#xff0c;仍按之前《机器学习》系列课程模式进行。前一系列《Keras入门教程》内容&#xff0c;与本系列…

【机器学习】Whisper:开源语音转文本(speech-to-text)大模型实战

目录 一、引言 二、Whisper 模型原理 2.1 模型架构 2.2 语音处理 2.3 文本处理 三、Whisper 模型实战 3.1 环境安装 3.2 模型下载 3.3 模型推理 3.4 完整代码 3.5 模型部署 四、总结 一、引言 上一篇对​​​​​​​ChatTTS文本转语音模型原理和实战进行了讲解&a…

【语义分割系列】基于cityscape的DDRNet算法

基于cityscape的DDRNet算法 前言 DDRNet是专门为实时语义分割设计的高效主干。该模型由两个深度分支组成,在这两个分支之间执行多次双边融合,并且还设计了一个新的上下文信息抽取器,名为深度聚合金字塔池模块(DAPPM),用于扩大有效的接受域,并基于低分辨率特征映射融合…

计算机网络——数据链路层(数据链路层概述及基本问题)

链路、数据链路和帧的概念 数据链路层在物理层提供服务的基础上向网络层提供服务&#xff0c;其主要作用是加强物理层传输原始比特流的功能&#xff0c;将物理层提供的可能出错的物理连接改造为逻辑上无差错的数据链路&#xff0c;使之对网络层表现为一条无差错的链路。 链路(…

Steam夏促史低游戏推荐 Steam夏促哪有游戏值得入手

steam夏季促销来袭&#xff0c;有这很多的游戏都进行打折出售&#xff0c;而且还有这很多的游戏都迎来了史低&#xff0c;简直是白送&#xff0c;很多玩家都想趁着这个时间入手自己喜欢的游戏&#xff0c;为了方便大家了解&#xff0c;下面我给大家带来steam夏季促销史低的游戏…

CO-DETR利用coco数据集训练和推理过程

CO-DETR利用coco数据集训练和推理过程&#xff0c;参考链接 Co-DETR训练自己的数据集 文章目录 前言训练过程推理过程总结 前言 环境&#xff1a;PyTorch 1.11.0 Python 3.8(ubuntu20.04) Cuda 11.3 先是在github上下载CO-DETR模型 !git clone https://github.com/Sense-X/Co…

陌陌笔试--并发打印文件内最有钱的老板的消费金额(算法)

题目&#xff1a; 算法中需要打印消费前十老板的消费金额&#xff0c;解决保留两位小数&#xff0c;并发是 JAVA 中的常考题&#xff0c; 我这里简单模拟下了数据&#xff0c;关键数据是用户id和消费金额。 解题思路&#xff1a; 1. 最简单的思路是单线程&#xff0c;偷懒…

狂神说Java之 rabbitmq高级分布式事务

分布式事务的完整架构图 案例场景分析 案例一&#xff1a;用RestTemplate演示&#xff08;不可靠生产&#xff0c;会出现问题&#xff09; 创建一个订单模块 创建一个OrderDataBaseService服务 创建一个order的service服务&#xff0c;调用saveOrder()方法 创建一个运单模块…

软件设计流程和开发流程及规范(Word)

2 过程总体描述 2.1 过程概述 2.2 过程流程图 3 过程元素描述 3.1 产品方案 3.2 产品设计 3.3 产品实现 获取方式&#xff1a;本文末个人名片直接获取。 软件资料清单列表部分文档清单&#xff1a;工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&#x…

找不到vcomp140.dll怎么办,总结多种解决方法

​在日常使用电脑的过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“vcomp140.dll丢失”。那么&#xff0c;vcomp140.dll是什么&#xff1f;它为什么会丢失&#xff1f;丢失后对电脑有什么影响&#xff1f;又该如何解决呢&#xff1f;本文将详细介绍vc…

根据肥胖类型选择减调方向收获窈窕身材

我们生活中胖子很多&#xff0c;从胖到瘦的人也不少&#xff0c;但瘦了后对自己身材满意的人却是不多的&#xff0c;很多人瘦了也只是减掉了身上的赘肉而已&#xff0c;大体的身形却是没有变化的&#xff0c;因此&#xff0c;并不感到满意。因为他们本身的形体是固定的&#xf…

SpringBoot-SpringBoot整合Swagger使用教程(图文介绍,一篇就够了)

前言 日常开发中&#xff0c;接口都是和开发文档相结合的。不论是和前端对接还是三方对接亦或者是接口留档&#xff0c;当我们开发完接口后&#xff0c;都需要去创建对应的接口文档。而修改接口后也要修改相对应的接口文档&#xff0c;但是这个真的很容易疏漏。而且相对于繁重的…