第10讲-并查集
课件:(下载)
#include <iostream>
#include <algorithm>
using namespace std;
#define N 101
//边集合,因为是无向图,所以只需要存一半的边
struct edge{
int w;
int v;
int d;
}e[N*N/2];
int father[N];
int n;
int edgeCount;//边的数量
//比较两个边的权值,用于排序
bool Cmp(const edge &v1,const edge &v2)
{
return v1.d<v2.d;
}
//数据初始化和数据输入
void Init()
{
edgeCount=0;
for( int k=1;k<=n;k++ )
{
father[k]=k;
}
int input;
for(int i=1;i<=n;i++)
{
for( int j=1;j<=n;j++ )
{
cin>>input;
if( i<j)
{
e[edgeCount].w = i;
e[edgeCount].v = j;
e[edgeCount].d = input;
edgeCount++;
}
}
}
//所有边按权值大小依次排序,注意第二个参数表示容器的end位置(即最后一个位置的后面一个位置)
sort(e,e+edgeCount,Cmp);
}
int GetFather(int x)
{
if(father[x]==x)
return x;
else
{
father[x] = GetFather(father[x]);//路径压缩
return father[x];
}
}
bool Merge(int x,int y)
{
x=GetFather(x);
y=GetFather(y);
if(x==y)
return false;
else
father[x]=y;
return true;
}
int Kruskal()
{
int sum=0;
for(int i=0;i<edgeCount;i++)
{
if(Merge(e[i].w,e[i].v))
sum+=e[i].d;
}
return sum;
}
int main()
{
while(cin>>n)
{
Init();
cout<<Kruskal()<<endl;
}
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· 程序员常用高效实用工具推荐,办公效率提升利器!
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)