最小生成树拓展应用

文章目录

  • 最小生成树拓展应用
      • 理论基础
    • 题单
        • 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…

揭开油烟净化器行业的黑幕:材料以次充好,消费者权益何在?

我最近分析了餐饮市场的油烟净化器等产品报告&#xff0c;解决了餐饮业厨房油腻的难题&#xff0c;更加方便了在餐饮业和商业场所有需求的小伙伴们。 油烟净化器&#xff0c;作为现代厨房环保的必需品&#xff0c;原本应是保护家庭和环境的利器。然而&#xff0c;近年来市场上…

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

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

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

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

c++字典

在C中&#xff0c;“字典”通常指的是std::map或std::unordered_map&#xff0c;它们是标准库中提供的关联容器&#xff0c;用于存储键值对。以下是一些常见的操作示例&#xff0c;包括插入、访问、删除和遍历元素。 使用 std::map std::map 是一种有序的关联容器&#xff0c;键…

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

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

【基础篇】第1章 Elasticsearch 引言

1.1 Elasticsearch简介 1.1.1 基本概念 Elasticsearch&#xff0c;一个开源的分布式搜索引擎&#xff0c;以其强大的搜索能力和实时数据分析能力&#xff0c;在大数据时代脱颖而出。它基于Apache Lucene库构建&#xff0c;旨在提供高效、可扩展且易于使用的全文检索解决方案。…

关于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公司的…

【BFS】【并查集】个人练习-Leetcode-815. Bus Routes

题目链接&#xff1a;https://leetcode.cn/problems/bus-routes/description/ 题目大意&#xff1a;给出一系列公交车路线routes[][]&#xff0c;每条路线上有一系列车站&#xff0c;可以搭乘同一班公交车经过这些车站。给出起点车站和终点车站&#xff0c;求最小的需要搭乘的…

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

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

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

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

impdp导入数据ORA-39142: 版本号 5.1不兼容错误

impdp导入数据ORA-39142: 版本号 5.1不兼容错误 1、错误现象 Import: Release 12.1.0.1.0 - Production on 星期三 6月 26 17:07:49 2024Copyright (c) 1982, 2013, Oracle and/or its affiliates. All rights reserved.连接到: Oracle Database 12c Enterprise Edition Rel…

基于FLAC3D的边坡稳定性动力分析——地震工况

基于FLAC3D的边坡稳定性动力分析——地震工况 参考张迎宾教授的文章——论文复现 Paper : Numerical Simulation of Seismic Slope Stability Analysis Based on Tension-Shear Failure Mechanism new config dyn set dynamic off restore zhang.sav def velE=77.88e6mu=0.3…

记录一个问题

问题描述 如果一个物料既在A总成零件号下计算为托盘库&#xff0c;在B总成零件号下计算为箱库&#xff0c;则放于箱库。 A中选择排名第21的递补进托盘库。&#xff08;也需要判断递补的是否在其他总成零件中为箱库&#xff0c;是的话继续递补判断&#xff09; 解决思路 为了…

13018.CUDA工程配置GDB调试

文章目录 1 工程CMakeLists.txt2 vscode配置launch.json,settings.json,tasks.json文件 1 工程CMakeLists.txt cmake_minimum_required(VERSION 3.8) # 根据你的CMake版本调整 # 设置项目名称 project(ez_compower_upward VERSION 0.1 LANGUAGES CXX CUDA)find_package(CUDA …

【机器学习】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;使之对网络层表现为一条无差错的链路。 链路(…