小镇改造 (最小生成树 Kruskal算法)

描述:

        一个小镇需要改造下水道系统,镇中的下水道系统有多个枢纽,这些枢纽之间通过下水道管道相连接,每两个枢纽之间最多只有一个管道, 每条管道都有一个分值,分值越低,代表管道使用率更高。因为经费有限,小镇只能改造尽可能少的管道,但是,改造的这些管道应当能够 直接或间接地把所有的枢纽连接起来。 请你为小镇设计一个方案,改造尽可能少的管道,同时在保证尽可能少的情况下,使改造的管道拥有最优的价值,即总分尽可能的低,确保更高的使用价值。 


 输入

     第一行有两个整数n,m,表示n个下水道枢纽,m条管道。接下来m行是对每条管道的描述,q,w,e。表示枢纽q和w之间有管道相连,对应分值为e 

 输出 

     输出你设计的方案中分值最高的那条管道的分值

示例测试集:

- 第1组

输入:

4 5
1 2 3
1 4 5
2 4 7
2 3 6
3 4 8

输出:

 
   

6 代码:#include<iostream> #include<algorithm> #include<stack> using namespace std; #define max 10000 typedef struct { int point_a, point_b, weight; }edge; edge e[max]; int root[max]; int hight[max]; void init(int n) { for (int i = 1; i <= n; i++) { root[i] = i; hight[i] = 0; } } int find(int x) { if (x == root[x]) { return x; } else { return root[x] = find(root[x]); } } void unite(int x, int y) { x = find(x); y = find(y); if (hight[x] < hight[y]) { root[x] = y; } else { root[y] = x; if (hight[x] == hight[y]) { hight[x]++; } } } int compare(const edge &a,const edge &b) { return a.weight < b.weight; } void kruskal(int m) { int maxw=0; stack<int> temp; sort(e+1,e+m+1,compare); for (int i = 1; i <= m; i++) { if (find(e[i].point_a) != find(e[i].point_b)) { temp.push(e[i].weight); unite(e[i].point_a, e[i].point_b); } } maxw = temp.top(); cout << maxw; } int main() { int n, m; cin >> n >> m; for (int i = 1; i <= m; i++) { cin >> e[i].point_a >> e[i].point_b >> e[i].weight; } init(n); kruskal(m); }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值