>Link
ybtoj繁忙都市
>Description
给出一张有边权的无向图,在其中选择最少的边使得所有点相通,且花费最少
>解题思路
首要条件是使得边数最少,那么肯定是将这
n
n
n个点连成一棵树,边数为
n
−
1
n-1
n−1
这时候就只用考虑花费最少,这么明显当然是用最小生成树啦
最小生成树我比较习惯用并查集来实现
>代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 100010
using namespace std;
struct edge
{
int u, v, w;
} a[N];
int n, m, c[N], ans;
bool cmp_w (edge aa, edge bb) {return aa.w < bb.w;}
int find (int now)
{
if (now == c[now]) return now;
return c[now] = find (c[now]);
}
int main()
{
scanf ("%d%d", &n, &m);
for (int i = 1; i <= n; i++) c[i] = i;
for (int i = 1; i <= m; i++)
scanf ("%d%d%d", &a[i].u, &a[i].v, &a[i].w);
sort (a + 1, a + 1 + m, cmp_w);
for (int i = 1; i <= m; i++)
{
int xx = find (a[i].u), yy = find (a[i].v);
if (xx != yy) //判断两点是否相通
{
ans = a[i].w;
c[xx] = yy;
}
}
printf ("%d %d", n - 1, ans);
return 0;
}