道路建设 (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

相关推荐

行云流水1971:这份实习简历的优化建议: 结构清晰化:拆分 “校园经历”“实习经历” 板块(当前内容混杂),按 “实习→校园→技能” 逻辑排版,求职意向明确为具体岗位(如 “市场 / 运营实习生”)。 经历具象化:现有描述偏流程,需补充 “动作 + 数据”,比如校园活动 “负责宣传” 可加 “运营公众号发布 5 篇推文,阅读量超 2000+,带动 300 + 人参与”;实习内容补充 “协助完成 XX 任务,效率提升 X%”。 岗位匹配度:锚定目标岗位能力,比如申请运营岗,突出 “内容编辑、活动执行” 相关动作;申请市场岗,强化 “资源对接、数据统计” 细节。 信息精简:删减冗余表述(如重复的 “负责”),用短句分点,比如 “策划校园招聘会:联系 10 + 企业,组织 200 + 学生参与,到场率达 85%”。 技能落地:将 “Office、PS” 绑定经历,比如 “用 Excel 整理活动数据,输出 3 份分析表;用 PS 设计 2 张活动海报”,避免技能单独罗列。 优化后需强化 “经历 - 能力 - 岗位需求” 的关联,让实习 / 校园经历的价值更直观。 若需要进一步优化服务,私信
实习,投递多份简历没人回...
点赞 评论 收藏
分享
评论
8
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务