AcWing 859. Kruskal算法求最小生成树
原题链接
简单
作者:
wadxad
,
2020-06-02 13:36:00
,
所有人可见
,
阅读 427
#include <bits/stdc++.h>
using namespace std;
#define p pair<int, int>
#define INF 1e9 + 7
const int N = 1e5 + 7;
multimap<int, p> m;//按边的大小从小到大排序,并保存对应节点对
int fa[N];//保存祖宗
int n, t, x, y, z, res, cnt = 1;//res保存最小路径长,cnt保存算法加的边
int find(int x)
{
return fa[x] = fa[x] == x ? x : find(fa[x]);//并查集经典找祖宗
}
int main(void)
{
cin >> n >> t;
for (int i = 1; i <= n; i++)//初始化祖宗(自己)
fa[i] = i;
while (t--)
{
cin >> x >> y >> z;
m.insert({z, {x, y}});
}
for (auto i : m)//i.second.first为x,i.second.second为y
{
if (find(i.second.first) == find(i.second.second))//判断成环(祖宗相同)
continue;
fa[find(i.second.first)] = find(i.second.second);//不同祖宗则合并
cnt++;
res += i.first;
}
if (res > INF / 2 || cnt != n)
cout << "impossible";
else
cout << res;
}