第三章 搜索与图论(三)(最小生成树,二分图)

一、最小生成树算法

稠密图使用prim算法,稀疏图使用kruskal算法

 

   二、prim算法求最小生成树

prim和dijkstra算法类似,都是找到符合某种条件的点,然后更新。prim使用到已经构成的部分最小树所有结点中最小的距离。dijkstra算法是使用到起点最小的距离。

#include<bits/stdc++.h>
//858 prim最小生成树 (稠密图做法)
using namespace std;
const int N=210,INF=0x3f3f3f3f;
int n,m;
int g[N][N];
int dist[N];
bool st[N];
int prim()
{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;}//如果经过一个循环之后t找到的最短边仍然是INF,但是在第一次的时候所有的都是INFif(i&&dist[t]==INF)return INF;st[t]=true;//由于存在负权自环所以在更新与点相连的所有边之前就保存边if(i) res+=dist[t];//展示了与dijkstra算法的不同之处,dist保存的是边,而不是某种路for(int j=1;j<=n;j++)dist[j]=min(dist[j],g[t][j]);}return res;
}int main()
{cin>>n>>m;memset(g,0x3f,sizeof g);memset(dist,0x3f, sizeof dist);for(int i=0;i<m;i++){int a,b,c;cin>>a>>b>>c;g[a][b]=min(g[a][b],c);}int ans=prim();if(ans==INF)puts("impossible");else cout<<ans<<endl;
}

三、kruskal算法

思路简单:

#include<bits/stdc++.h>
//858 prim最小生成树 (稠密图做法)
using namespace std;
const int N=210,INF=0x3f3f3f3f;
int n,m;
int g[N][N];
int dist[N];
bool st[N];
int p[N];
struct Edge
{int a,b,w;bool operator <(const Edge &W)const{return w<W.w;}
}edges[N];int find(int a)
{if(p[a]==a)return a;else  p[a]=find(p[a]); return p[a];
}
int main()
{cin>>n>>m;for(int i=0;i<m;i++){int a,b,c;cin>>a>>b>>c;edges[i]={a,b,c};}sort(edges,edges+m);for(int i=0;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,c=edges[i].w;a=find(a),b==find(b);if(a!=b){p[a]=b;//将其连接res+=c;cnt++;}}if(cnt!=n-1)puts("impossible");else cout<<res<<endl;
}

 四、二分图(染色法判断是否有奇数环)

一个图是二分图当且仅当图中不含有奇数环(环中边的数量是奇数)

如果图当中不含有奇数环染色过程中没有矛盾。

思路:因为有多个连通块,而每次dfs就把连通块里面的所有的点全部遍历了,然后找其他连通块里面的点。

染色法dfs判断奇数环:对于当前点连接的所有边,判断这个点是否已经被染色,没有被染色继续染色,染色了,如果和相连的点的颜色相同,说明有奇数环。

#include<bits/stdc++.h>
//858 prim最小生成树 (稠密图做法)
using namespace std;
const int N=100010,M=200010;
int m,n;
int color[N];//染色情况
int e[N],ne[N],h[N],idx;
void add(int a,int b)
{//e保存边idx的终点是什么//ne保存idx这条边连接的下一条边//更新h的值e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
//对一个连通块进行深度优先遍历
bool dfs(int u,int c)
{color[u]=c;for(int i=h[u];i!=-1;i=ne[i]){int j=e[i];if(!color[j]){//只要有一个不通就返回falseif(!dfs(j,3-c))return false;}else if(color[j]==c)return false;}return true;}
int main()
{//cmemset(color,0,sizeof color);memset(h,-1,sizeof h);cin>>n>>m;for(int i=0;i<m;i++){int a,b,c;cin>>a>>b;add(a,b),add(b,a);}int flag=0;//遍历所有还没有遍历到的连通块,for(int i=1;i<=n;i++){if(!color[i]){if(!dfs(i,1))//随便取一个颜色,因为相邻两次循环就{flag=1;break;}}}if(flag) puts("No");else puts("Yes");}

五、匈牙利算法(两组结点最多的匹配)

首先按照第一选择进行匹配,后面匹配冲突的时候,去看先匹配的那个可不可以调整。

使用bool数组st保证回去调整的时候不会选到同一个点,也就是一个点不会被同一个点匹配到两次。

#include<bits/stdc++.h>
//861二分图的最大匹配(匈牙利算法)
using namespace std;
const int N=500,M=100010;
int e[N],ne[M],h[N],idx;
int st[N];
int match[N],n1,n2,m;
void add(int a,int b)
{e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}int find(int u)
{for(int i=h[u];i!=-1;i=ne[i])//与u相连的所有点{int j=e[i];//因为可能在调整的过程中重复调用find函数,此时st[j]已经为true//不会再选这个点了if(!st[j])//之前有没有被考虑过{st[j]=true;//如果与其相连的点没有匹配//或者匹配了但是可以更换if(match[j]==0||find(match[j])){//匹配上一个点match[j]=u;return true;}}}//尝试了所有的出边所连的点都不行的时候return false;
}
int main()
{cin>>n1>>n2>>m;while(m--){int a,b;cin>>a>>b;add(a,b);}int res=0;for(int i=1;i<=n1;i++){if(find(1))res++;}cout<<res<<endl;
}

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

43.1k star, 免费开源的 markdown 编辑器

简介 项目名&#xff1a; MarkText-- 简单而优雅的开源 Markdown 编辑器 Github 开源地址&#xff1a; https://github.com/marktext/marktext 官网&#xff1a; https://www.marktext.cc/ 支持平台&#xff1a; Linux, macOS 以及 Windows。 操作界面&#xff1a; 在操作界…

七、滚动条操作——调整图像对比度

对比度调整&#xff1a;是在原来图像基础上进行相应的公式调整&#xff0c;是类似乘法操作&#xff0c;本身像数值越大&#xff0c;对比度增加之后其与低像素点值差距越大&#xff0c;导致对比增强 项目最终效果&#xff1a;通过滚动条trackbar来实现调整图片亮度的功能 我这里…

小游戏和GUI编程(5) | SVG图像格式简介

小游戏和GUI编程(5) | SVG图像格式简介 0. 问题 Q1: SVG 是什么的缩写&#xff1f;Q2: SVG 是一种图像格式吗&#xff1f;Q3: SVG 相对于其他图像格式的优点和缺点是什么&#xff1f;Q4: 哪些工具可以查看 SVG 图像&#xff1f;Q5: SVG 图像格式的规范是怎样的&#xff1f;Q6…

基于JSP的网上购书系统

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/88825694?spm1001.2014.3001.5503 Java项目-15 源码论文数据库配置文件 基于JSP的网上购书系统 摘要 在当今的社会中&#xff0c; 随着社会经济的快速发展以及计算机网络技术和通讯技术…

css2复合选择器

一.后代&#xff08;包含&#xff09;选择器&#xff08;一样的标签可以用class命名以分别&#xff09; 空格表示 全部后代 应用 二.子类选择器 >表示 只要子不要孙 应用 三.并集选择器 &#xff0c;表示 代表和 一般竖着写 应用 四.伪类选择器&#xff08;包括伪链接…

python WEB接口自动化测试之requests库详解

由于web接口自动化测试需要用到python的第三方库--requests库&#xff0c;运用requests库可以模拟发送http请求&#xff0c;再结合unittest测试框架&#xff0c;就能完成web接口自动化测试。 所以笔者今天先来总结一下requests库的用法。希望对大家&#xff08;尤其是新手&…

[C# WPF] DataGrid选中行或选中单元格的背景和字体颜色修改

问题描述 WPF中DataGrid的选中行或选中者单元格&#xff0c;在焦点失去后&#xff0c;颜色会很淡&#xff0c;很不明显&#xff0c;不容易区分。 解决方法 在失去焦点的情况下&#xff0c;如何设置行或单元格与选中的时候颜色一样&#xff1f; <DataGrid.Resources>&…

Postgresql 的编译安装与包管理安装, 全发行版 Linux 通用

博客原文 文章目录 实验环境信息编译安装获取安装包环境依赖编译安装安装 contrib 下工具代码 创建用户创建数据目录设置开机自启动启动数据库常用运维操作 apt 安装更新源安装 postgresql开机自启修改配置修改密码 实验环境信息 Ubuntu 20.04Postgre 16.1 编译安装 获取安装…

BUUCTF LKWA

1.访问页面。 2.选择 Variables variable 关卡 3.获得flag http://357dab81-78b8-4d74-976a-4a69dd894542.node5.buuoj.cn:81/variables/variable.php?funcpassthru&inputcat%2Fflagflag{0020ced6-8166-4fa5-87a7-7d93ee687c3e}

【Linux笔记】动静态库的封装和加载

一、静态库的封装 我们在学习C语言阶段其实就已经知道一个可执行程序的形成过程分为预处理、编译、汇编、链接这四个阶段&#xff0c;而且也知道我们程序中使用的各种库其实是在链接的阶段加载的。 可我们那时候并不知道库是怎么被加载的&#xff0c;或者库是怎么形成的&…

结构体的大小以及内存对齐问题

结构体的大小怎么计算&#xff1f;什么是结构体的对齐&#xff1f; 首先想要直到结构体的大小需要先了解结构体的内存对齐。那么&#xff0c;什么是结构体的内存对齐&#xff1a; 什么是结构体内存对齐 结构体的对齐 就是 结构体类型数据在内存中按照一定的对齐规律储存。结…

python+django高校活动报名场地管理系统l1ro4

校园活动管理平台程序的开发&#xff0c;在数据库的选择上面&#xff0c;选择功能强大的MySQL数据库进行数据的存放操作。 技术栈 后端&#xff1a;python 前端&#xff1a;vue.jselementui 框架&#xff1a;django Python版本&#xff1a;python3.7 数据库&#xff1a;mysql5…

实现自定义标记

实现自定义标记 问题陈述 New Tech Book的高级管理层决定在其用JSP设计的应用程序的所有页面上显示版权信息。它们还要去如何向应用程序中添加JSP页面,可以重用显示版本信息的代码。公司的软件开发人员Jerry Smith决定用自定义标记来创建应用程序的这一部分。 解决方案 要解…

kali最新最简单安装

之前都是用iso镜像文件的 今年好多东西都删库了&#xff0c;所有还是要主要资源的保存 去官网找下载 一般来说都是用虚拟机的 下载完会是一个压缩文件&#xff0c; 解压&#xff0c;然后操作之前需要先下载虚拟机 打开方式用虚拟机打开 kali就按装好了

腾讯云4核8G服务器可以用来干嘛?怎么收费?

腾讯云4核8G服务器适合做什么&#xff1f;搭建网站博客、企业官网、小程序、小游戏后端服务器、电商应用、云盘和图床等均可以&#xff0c;腾讯云4核8G服务器可以选择轻量应用服务器4核8G12M或云服务器CVM&#xff0c;轻量服务器和标准型CVM服务器性能是差不多的&#xff0c;轻…

Minecraft的红石教程之电梯

一.前言 我记得是上初中的时候&#xff0c;就看到了这类电梯。现在我在看现在这类电梯的相关视频&#xff0c;大多是盗用创意未能领会其中的红石运作规律&#xff0c;于是我就删繁就简写了这篇。 二.步骤 1.材料 粘性活塞&#xff0c;黏液块&#xff0c;红石&#xff0c;红…

考研数据结构笔记(6)

单链表的建立 单链表的建立尾插法头插法 双链表初始化插入删除遍历小结 单链表的建立 尾插法 首先对单链表进行定义&#xff0c;然后初始化 法1&#xff1a;定义遍历链表的插入函数 法2&#xff1a;利用指针移动建立函数 头插法 带头结点 双链表 初始化 插入 p节点不是最后…

【Linux】学习-基础IO—下

Linux基础IO—上 重定向 通过上篇的学习&#xff0c;我们了解了文件描述符的分配规则是遍历指针数组&#xff0c;用没有被使用的最小下标作为新的文件描述符&#xff0c;也就是我们可以通过关闭三个标准流文件并使用他们原先所占用的0&#xff0c;1&#xff0c;2描述符。 那…

【蓝桥杯Python】试题 算法训练 藏匿的刺客

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 强大的kAc建立了强大的帝国&#xff0c;但人民深受其学霸及23文化的压迫&#xff0c;于是勇敢的鹏决心反抗。   kAc帝国防守…

元素显示模式

1.块级元素 显示特点&#xff1a; 1.独占一行&#xff08;一行只能显示一个&#xff09; 宽度默认是父元素的宽度可以设置宽高 代表标签&#xff1a;div、p、h系列、ul、li、dl、dd、from、header、nav、footer...... 2.行内元素 显示特点&#xff1a; 一行可以显示多个宽…