道路建设 (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(); }
谢谢浏览哈