道路建设 (kruskal算法)

道路建设

https://ac.nowcoder.com/acm/problem/15108

题目链接:https://ac.nowcoder.com/acm/problem/15108
显然这是一道 最小生成树的题
其中利用的是 kruskal算法
kruskal 算法思想:贪心选取最短的边来组成一棵最小的生成树。
具体做法:先将所有的边做排序,然后利用并查集作判断来优先选择较小的边,直 到建成一棵生成树。
实现方式:并查集
模板代码:
图片说明
下面贴上本题代码:

#include<iostream>
#include<algorithm>
#include<set>
#include<string>
#include<cstring>
using namespace std;
int c, n, m;
struct road
{
    int u, v, h;
}edge[10005];
int fa[105];
int find(int x) {
    return (fa[x] == x ? x : find(fa[x]));
}
void merge(int x, int y) {
    fa[find(x)] =find( y);
}
bool cmp(road a, road b) {
    return (a.h < b.h);
}
void Kruskal() {
    int cnt = 0,sum=0;//cnt:造的路的条数 sum:造的路的总价值
    sort(edge + 1, edge + n + 1, cmp);
    for (int i = 1;i <= m;i++) { fa[i] = i; }
    for (int i = 1;i <= n;i++) {
        int u = edge[i].u, v = edge[i].v;
        if (find(u) != find(v)) {
            merge(u, v);
            cnt++;
            sum += edge[i].h;
            if (cnt >= n - 1) { break; }
        }
    }
    if (cnt<m-1 || sum>c) { cout << "No\n"; }//m个城市连通,至少需要m-1条道路
    else {
        cout << "Yes\n";
    }
}
int main(){
    cin >> c>>n >> m;
    for (int i = 1;i <= n;i++) { cin >> edge[i].u >> edge[i].v >> edge[i].h; }
    Kruskal();
}

谢谢浏览哈

全部评论
请问一下为什么要cnt >= n - 1而不是cnt>=n,不是可以有n条路嘛?
点赞 回复 分享
发布于 2020-11-14 00:23

相关推荐

不愿透露姓名的神秘牛友
10-15 14:22
点赞 评论 收藏
分享
8 收藏 评论
分享
牛客网
牛客企业服务