第10讲-并查集

课件:(下载

【POJ1258】Agri-Net

复制代码
#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;
}
复制代码

 

 

 

posted @   屠一刀  阅读(251)  评论(0编辑  收藏  举报
编辑推荐:
· 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)
点击右上角即可分享
微信分享提示