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

最小生成树

时间:2022-09-04 11:25:41浏览次数:99  
标签:return int 最小 生成 fa 算法 find

《不能使用最小生成树的情况》

在没有说不能产生回路时:

 

 这个情况是不能使用最小生成树算法的,因为边可以是负的,如果再加上一条边,这条边是负的,正好还可以减少权重

《Kruskal算法的大用》

用kruskal算法就像用一个进度条求最小生成树一样,即如果在开始时,最小生成树已经完成了一部分,可以用

kruskal算法继续完成,或者有些必要条件必须选边用这个算法更加方便,如:

 

 

 

 连接格点这道题,如果像平常使用kruskal算法包含sort会超时,

那我们可以在建图的时候就按照边权小的先建

 1 #include<bits/stdc++.h>
 2 #define N 1010
 3 using namespace std;
 4 int n,m;
 5 int fa[N*N],tot;
 6 int find(int x)//并查集基本操作
 7 {
 8     if(fa[x]==x)
 9         return x;
10     return fa[x]=find(fa[x]);
11 }
12 inline int merge(int x,int y)//并查集基本操作
13 {
14     int fa_x=find(x);
15     int fa_y=find(y);
16     if(fa_x!=fa_y){
17         fa[fa_y]=fa_x;
18         return 1;//已经连了一条边
19     }
20     return 0;
21 }
22 int main()
23 {
24     scanf("%d %d",&n,&m);
25     for(int i=1;i<=n*m;i++)//并查集初始化
26        fa[i]=i;
27     int x1,y1,x2,y2;
28     while(~scanf("%d %d %d %d",&x1,&y1,&x2,&y2)){
29         int u=(x1-1)*m+y1,v=(x2-1)*m+y2;//转换为对应的编号
30         merge(u,v);//合并
31     }
32     for(int i=1;i<=m;i++)//竖向合并一遍
33         for(int j=1;j<n;j++){
34             int u=(j-1)*m+i,v=j*m+i;//坐标转换
35             if(merge(u,v))//当前两点有一条边连接
36                 tot++;//竖向答案+1
37         }
38     for(int i=1;i<=n;i++)//横向合并一遍
39         for(int j=1;j<m;j++){
40             int u=(i-1)*m+j,v=(i-1)*m+j+1;//坐标转换
41             if(merge(u,v))//当前两点有一条边连接
42                 tot+=2;//横向答案+2
43         }
44     printf("%d\n",tot);
45     return 0;
46 }

 

标签:return,int,最小,生成,fa,算法,find
From: https://www.cnblogs.com/cilinmengye/p/16654666.html

相关文章

  • 为lazarus编译的程序生成deb安装包
    生成deb安装包可以手工打包和程序自动打包,手工打包主要是有建相关目录和编写control文件,程序打包自动生成相关目录及control文件。以下手工打包的方法:debDEB 是Debi......
  • 推导式(生成式)
    作用:简化代码量1.列表推导式2.字典推导式3.集合推导式一、列表推导式作用:用一个表达式创建一个有规律的列表或控制一个有规律列表1.1体验: #需求:创......
  • 最小生成树
    专门开个博客一是因为没地放了,二是以后次小生成树什么的就一块扔这了。点数n,边数m的图的最小生成树大概有两个算法:Kruskal算法(\(O(m\logm)\))思路非常简单粗暴,把所......
  • java mysql删除表中多余的重复记录(多个字段),只留有id最小的记录
    mysql删除表中多余的重复记录(多个字段),只留有id最小的记录DELETEFROM表1fWHERE(f.字段1,f.字段2)IN(SELECT字段1,字段2FROM表1GROUPBY字段1,字段2HAVING......
  • Problem P04. [算法课分治] 找到 k 个最小数
    先sort排序,在输出最小的k个数。#include<iostream>#include<bits/stdc++.h>#include<cstdio>usingnamespacestd;intn,k;intarr[10005];intmain(){......
  • mybatis-plus-generator 配置不生成 entity, controller, mapper 等
    3.5.2版本有需求不生成controller于是baidu发现如下方法.templateConfig(builder->builder.controller(""))配置后确实不生成controller 又有需求不生成entit......
  • python随机值生成的常用方法
    一、随机整数1.包含上下限:[a,b]importrandom#1、随机整数:包含上下限:[a,b]foriinrange(10):print(random.randint(0,5),end="|")查看运行结果:2.不包含上......
  • 最小函数值
    P2085最小函数值-洛谷|计算机科学教育新生态(luogu.com.cn)输入系数时同时把x=1的情况入队place[i]代表第i个函数目前应该处理的自然数输出m个,每次循环输出堆顶......
  • springboot~Screw生成数据库文档
    数据库说明文档,在我们开发项目时是非常必要的,有时项目交付时,客户也是需要让我们提供的,而如果人工编写,比如耗时,通过screw组件来生成文档,非常方便。源代码和使用:https://g......
  • K8s - 重新生成token以及hash值(解决令牌过期的问题)
     当我们使用 kubeadminit 完成 Master 节点的安装后,界面上会输出如下 kubeadmjoin…… 命令。这个命令使用来将各个节点加入集群中。kubeadmjoin192.168.60......