#include<iostream>
#include<algorithm>
using namespace std;
const int N = 10010;
struct edge {
int a, b, c;
}edges[N];
bool cmp(edge &a,edge &b)
{
return a.c < b.c;
}
int n,m=0;
int p[N];
int find(int x)
{
if (x != p[x]) p[x] = find(p[x]);
return p[x];
}
int kruskal()
{
int res = 0, cnt = 0;
for (int i = 1; i <= n; i++)
p[i] = i;
sort(edges, edges + m, cmp);
for (int i = 0; i < m; i++)
{
int a = edges[i].a; int b = edges[i].b; int c = edges[i].c;
a = find(a); b = find(b);
if (a != b)
{
p[a] = b;
res += c;
cnt++;
}
}
if (cnt < n - 1) return 0x3f3f3f3f;
return res;
}
int main()
{
cin >> n;
int x;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> x;
if (i > j)//虽然给定的是稠密图,但是还是可以转化为结构体存储的方式来使用kruskal算法
{
edges[m++] = { i,j,x };
}
}
}
int t = kruskal();
cout << t;
}
刷题日记 洛谷1546 最短网络 最小生成树 kruskal算法
最新推荐文章于 2024-09-12 13:19:42 发布