搜索与图论(三)

一、最小生成树

1.1Prim算法

朴素版Prim

一般用于稠密图

算法流程:

集合表示当前已经在连通块的点

1.初始化距离,把所有距离都初始化为正无穷

2.n次迭代,找到集合外距离最小的点 ->t

3.用t来更新其它点到集合的距离

#include<iostream>
#include<cstring>
#include<algorithm>using namespace std;const int N = 510,INF = 0x3f3f3f3f;int n,m;
int g[N][N];
int dist[N];
bool st[N];int prim()
{memset(dsit,0x3f,sizeof dsit);int res = 0;for(int i = 0;i < n;i ++){int t = -1;for(int j = 1;j <= n;j ++){if(! st[j] && (t == -1 || dist[t] > dist[j]))t = j;}if(i && dist[t] == INF) return INF;for(int j = 1;j <=n;j ++) dist[j] = min(dist[j],g[t][j]);st[t] = true;}return res;
}
int main()
{scanf("%d%d",&n,&m);memset(g,0x3f,sizeof g);while(m --){int a,b,c;scanf("%d%d%d",&a,&b,&c);g[a][b] = g[b][a] = min(g[a][b],c);}int t = prim();if(t == INF) puts("impossible");else printf("%d\n",t);return 0;
}

1.2Kruskal算法

一般用于稀疏图

算法流程:

1.将所有边按照权重从小到大排序

2.枚举每一条边(a,b),权重为c

如果(a,b)不连通,则将这条边加入集合中

#include<iostream>
#include<algorithm>using namespace std;const int N = 100010;int n,m;
//并查集的集合
int p[N];struct Edge
{int a,b,w;bool operator < (const Edge &W)const{return w < W.w;}
}edges[N];int find(int x)
{if(p[x] != x) p[x] = find(p[x]);return p[x];
}
int main()
{scanf("%d%d",&n,&m);for(int i = 0;i < m;i ++){int a,b,w;scanf("%d%d%d",&a,&b,&w);edges[i] = {a,b,w};}sort(edges,edges + m);for(int i = 1;i <= n;i ++) p[i] = i;int res = 0,cnt = 0;for(int i = 0; i < m; i ++){//从小到大枚举所有边int a = edges[i].a,b = edges[i].b,w = edges[i].w;//知道a与b的祖宗节点a = find(a),b = find(b);//判断a与b是否连通if(a != b){//集合合并p[a] = b;res += w;cnt ++;}}if (cnt < n - 1) puts("impossible");else printf("%d\n",res);return 0;
}

二、二分图

二分图当且仅当图中不含奇数环

2.1染色法

#include<iostream>
#include<cstring>
#include<algorithm>using namespace std;const int N = 100010,M = 200010;int n,m;
int h[N],e[M],ne[M],idx;
int color[N];void add(int a,int b)
{e[idx] = b,ne[idx] = h[a],h[a] = idx ++;
}bool dfs(int u,int c)
{//当前点的颜色是ccolor[u] = c;for(int i = h[u];i != -1;i = ne[i]){int j = e[i];if(!color[j]){if(!dfs(j,3 - c)) return false;}else if (color[j] == c) return false;}return true;
}int main()
{scanf("%d%d",&n,&m);memset(h,-1,sizeof h);while(m --){int a,b;scanf("%d%d",&a,&b);add(a,b),add(b,a);}bool flag = true;for(int i = 1;i <=n;i ++){if(!color[i]){if(!dfs(i,1)){flag = false;break;}}}if(flag) puts("Yes");else puts("No");return 0;
}

2.2匈牙利算法

#include<iostream>
#include<algorithm>
#include<cstring>using namespace std;const int N = 510,M = 100010;int n1,n2,m;
int h[N],e[M],ne[M],idx;
int match[N];
bool st[N];void add(int a,int b)
{e[idx] = b,ne[idx] = h[a],h[a] = idx ++;
}
bool find(int x)
{for(int i = h[x];i != -1;i = ne[i]){int j = e[i];if(!st[j]){st[j] = true;if(match[j] == 0 || find(match[j])){match[j] = x;return true;}}}return false;
}
int main()
{scanf("%d%d%d",&n1,&n2,&m);memset(h,-1,sizeof h);while(m --){int a,b;scanf("%d%d",&a,&b);add(a,b);}int res = 0;for(int i = 0;i <= n1;i ++){memset(st,false,sizeof st);if(find(i)) res ++;}printf("%d\n",res);return 0;
}

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

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

相关文章

小红书博主排名丨狂揽近百万粉丝,女性议题成“爆款制造机”?

从上野千鹤子和北大女生的对谈&#xff0c;到电影《消失的她》&#xff0c;再到引爆“粉色狂潮”的电影《芭比》&#xff0c;近年来&#xff0c;女性话题、两性情感话题成为社会热门议题。“踩过恋爱所有坑&#xff0c;想给姑娘撑把伞”&#xff0c;近期&#xff0c;小红书博主…

Qt tabwidget中插入widget

一、简单介绍 QT->tabWidget&#xff1a;标签页面。 在ui中通过工具栏自定义拉取控件&#xff0c;其中tabwidget可以可以创建多个标签页面&#xff0c;默认生成两个tab_widget(tab_1/tab_2)。并且可以在ui中右键自由添加控制删除等标签页&#xff0c;切换标签页就是切换widg…

Greenplum集群部署

一,安装说明 1.1环境说明 *名称**版本*操作系统CentOS 7.6 64bitgreenplumgreenplum-db-6.10.1-rhel7-x86_64.rpm1.2集群介绍 IPhostname集群节点10.240.3.244gpmastermaster10.240.3.245gpsegment1segment10.240.3.246gpsegment2segment二,安装环境准备 2.1 修改各节点名称…

Uniapp_app端使用重力感应实现横屏竖屏自动切换

1、进入页面默认是竖屏当手机横着的时候页面也跟着横着 进入页面开启定时器调用相关api去触发横屏竖屏&#xff0c;主要核心代码都在onShow()里面和onHide()里 <template> <view class"monitor"><u-no-network></u-no-network><web-view …

基于组合双向拍卖的共享储能机制研究(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 2.1 算例数据 2.2 买家中标 2.3 卖家中标 &#x1f389;3 文献来源 &#x1f308;4 Matlab代码实现 &#x1f4a5;1 概述 文献来源&#xff1a; 摘要&#xff1a;为满足共享储能中储能用户的互补性和替代性需求、解决常规单…

一文说清楚支付架构

作者&#xff1a;陈斌 支付的技术架构是为了保障能够顺利处理支付请求而设计的结构体系。从系统的角度看&#xff0c;它包括了计算机系统的软件、硬件、网络和数据等。从参与的主体角度来看&#xff0c;它涉及交易的付款方、收款方、支付机构、银行、卡组织和金融监管机构等。要…

无涯教程-Lua - while语句函数

只要给定条件为真&#xff0c;Lua编程语言中的 while 循环语句就会重复执行目标语句。 while loop - 语法 Lua编程语言中 while 循环的语法如下- while(condition) dostatement(s) end while loop - 流程图 在这里&#xff0c;需要注意的关键是 while 循环可能根本不执行。…

SOC FPGA之流水灯设计

一、DS-5简介 Altera Soc EDS开发套件的核心是Altera版ARM Development Studio 5(DS-5)工具包&#xff0c;为SoC器件提供了完整的嵌入式开发环境、FPGA自适应调试和对Altera工具的兼容。 1.1 DS-5 eclipse破解 首先下载破解器 然后进入cmd运行&#xff0c;进入到破解器所在文…

XCode升级后QT无法编译的问题

原因是SDK的版本变了&#xff0c;Qt配置的版本要修改。 解决办法如下&#xff1a; 1.找到 /Users/*/Qt/5.15.2/clang_64/mkspecsqdevice.pri 这个文件打开编辑&#xff0c; 在文件末尾追加一句 !host_build:QMAKE_MAC_SDKmacosx13.1 至于这个版本号13.1是怎么来的呢&#xff1…

kafka简介

kafka是什么&#xff1f; Kafka最初采用Scala语言开发的一个多分区、多副本并且基于ZooKeeper协调的分布式消息系统。目前Kafka已经定位为一个分布式流式处理平台&#xff0c;它的特性有高吞吐、可持久化、可水平扩展、支持流处理。 Apache Kafka是一个分布式的发布-订阅消息系…

no_new_privs

kernel.org/doc/Documentation/prctl/no_new_privs.txt Linux Capabilities 入门教程&#xff1a;基础实战篇 - 知乎 (zhihu.com)

两数之和 LeetCode热题100

题目 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意顺…

Kubernetes高可用集群二进制部署(三)部署api-server

Kubernetes概述 使用kubeadm快速部署一个k8s集群 Kubernetes高可用集群二进制部署&#xff08;一&#xff09;主机准备和负载均衡器安装 Kubernetes高可用集群二进制部署&#xff08;二&#xff09;ETCD集群部署 Kubernetes高可用集群二进制部署&#xff08;三&#xff09;部署…

代理模式--静态代理和动态代理

1.代理模式 定义&#xff1a;代理模式就是代替对象具备真实对象的功能&#xff0c;并代替真实对象完成相应的操作并且在不改变真实对象源代码的情况下扩展其功能&#xff0c;在某些情况下&#xff0c;⼀个对象不适合或者不能直接引⽤另⼀个对象&#xff0c;⽽代理对象可以在客户…

抄写Linux源码(Day3:启动南大OS)

我们可以尝试启动南大OS&#xff0c;接着阅读南大OS源码&#xff0c;看看 JYY/YZH 构建主引导扇区的手段 &#xff08;注意&#xff1a;我使用的是南大2023年的 OS 实验代码&#xff09; https://jyywiki.cn/OS/2023/labs/Labs 首先&#xff0c;根据 JYY 的文档&#xff0c;…

力扣 C++|一题多解之动态规划专题(1)

动态规划 Dynamic Programming 简写为 DP&#xff0c;是运筹学的一个分支&#xff0c;是求解决策过程最优化的过程。20世纪50年代初&#xff0c;美国数学家贝尔曼&#xff08;R.Bellman&#xff09;等人在研究多阶段决策过程的优化问题时&#xff0c;提出了著名的最优化原理&…

PHP8的数据类型转换-PHP8知识详解

什么是数据类型转换&#xff1f; 答&#xff1a;数据从一个类型转换成另外一个类型&#xff0c;就是数据类型转换。 在PHP8中&#xff0c;变量的类型就是由赋值决定的&#xff0c;也就是说&#xff0c;如果 string 赋值给 $var&#xff0c;然后 $var 的类型就是 string。之后…

【雕爷学编程】MicroPython动手做(30)——物联网之Blynk 3

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

百分点科技跻身中国智慧应急人工智能解决方案市场前三

近日&#xff0c; 全球领先的IT市场研究和咨询公司IDC发布了《中国智慧应急解决方案市场份额&#xff0c;2022》报告&#xff0c;数据显示&#xff0c;2022年中国智慧应急整体市场为104亿元人民币。其中&#xff0c;智慧应急人工智能解决方案子市场备受关注&#xff0c;百分点科…

C# 文件读写 程序

//读写文件 public class ReadWriteFile { public static List<string> ReadFile(string path) { try { using (FileStream fileStream new FileStream(path, FileMode.Open, FileAccess.Read)) { Lis…