#P2023. 最小生成树.Kurskal算法.填空题
最小生成树.Kurskal算法.填空题
题目描述
如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出 orz
。
输入格式
第一行包含两个整数 ,表示该图共有 个结点和 条无向边。
接下来 行每行包含三个整数 ,表示有一条长度为 的无向边连接结点 。
数据规模
对于 的数据,,。
对于 的数据,,。
对于 的数据,,。
对于 的数据:,,。
所以最小生成树的总边权为 。
输出格式
如果该图连通,则输出一个整数表示最小生成树的各边的长度之和。如果该图不连通则输出 orz
。
样例
4 5
1 2 2
1 3 2
1 4 3
2 3 4
3 4 3
7
样例解释
完善程序
#include<bits/stdc++.h>
using namespace std;
struct Edge
{
int u,v,w;
}x[200001];
bool cmp(Edge i,Edge j)
{
return 填空(1);
}
int n,m,fa[5001];
void init()
{
for(int i=1;i<=n;i++) fa[i] = 填空(2);
}
int find(int t)
{
if(fa[t]==t) return 填空(3);
else return 填空(4);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
scanf("%d%d%d",&x[i].u,&x[i].v,&x[i].w);
sort(x+1,填空(5),cmp);
int cnt=0,a,b,ans=0;
init();
for(int i=1;i<=m;i++)
{
a = find(x[i].u);
b = find(x[i].v);
if(a!=b)
{
cnt++;
填空(6);
ans += 填空(7);
}
if(cnt==填空(8))
{
printf("%d",填空(9));
填空(10);
}
}
printf("orz");
return 0;
}
填空(1): {{ input(1) }}
填空(2): {{ input(2) }}
填空(3): {{ input(3) }}
填空(4): {{ input(4) }}
填空(5): {{ input(5) }}
填空(6): {{ input(6) }}
填空(7): {{ input(7) }}
填空(8): {{ input(8) }}
填空(9): {{ input(9) }}
填空(10): {{ input(10) }}