Out of Hay

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 20765   Accepted: 8208

Description

The cows have run out of hay, a horrible event that must be remedied immediately. Bessie intends to visit the other farms to survey their hay situation. There are N (2 <= N <= 2,000) farms (numbered 1…N); Bessie starts at Farm 1. She’ll traverse some or all of the M (1 <= M <= 10,000) two-way roads whose length does not exceed 1,000,000,000 that connect the farms. Some farms may be multiply connected with different length roads. All farms are connected one way or another to Farm 1.

Bessie is trying to decide how large a waterskin she will need. She knows that she needs one ounce of water for each unit of length of a road. Since she can get more water at each farm, she’s only concerned about the length of the longest road. Of course, she plans her route between farms such that she minimizes the amount of water she must carry.

Help Bessie know the largest amount of water she will ever have to carry: what is the length of longest road she’ll have to travel between any two farms, presuming she chooses routes that minimize that number? This means, of course, that she might backtrack over a road in order to minimize the length of the longest road she’ll have to traverse.
Input

  • Line 1: Two space-separated integers, N and M.

  • Lines 2…1+M: Line i+1 contains three space-separated integers, A_i, B_i, and L_i, describing a road from A_i to B_i of length L_i.
    Output

  • Line 1: A single integer that is the length of the longest road required to be traversed.

Sample Input

3 3
1 2 23
2 3 1000
1 3 43

Sample Output

43
Hint

OUTPUT DETAILS:

In order to reach farm 2, Bessie travels along a road of length 23. To reach farm 3, Bessie travels along a road of length 43. With capacity 43, she can travel along these roads provided that she refills her tank to maximum capacity before she starts down a road.

题目大概意思:

给出一个含 N(2≤N≤2×103)N(2≤N≤2×10^3)N(2≤N≤2×103) 个节点, M(1≤M≤104)M(1≤M≤10^4)M(1≤M≤104) 个边的连通图,第 iii 条边连接节点 AAA 和 BBB ,边权为 Ci(Ci≤109)C_i(C_i≤10^9)Ci​(Ci​≤109) 。求一生成树,使得生成树中边权最大的边的边权最小,输出这个最小的最大值。

分析:

最小化最大值问题,首先想到二分求解,即每次选定一个最大值,只使用边权小于等于该最大值的边,判断能否构成生成树,算法时间复杂度为 O(M⋅log⁡2Cmax)O(M·\log_2{C_{max}})O(M⋅log2​Cmax​) 。但此题我门还可以使用更为高效的无需二分求解办法,即:

  1. 先按照边权从小到大将边排序。
  2. 从左到右遍历每条边,利用 KruskalKruskalKruskal 算法 的思想:如果当前边的两个端点尚未在一个集合,则合并这两个节点所在的集合,并更新答案。

由于是按边权从小到大遍历每条边,因此最终得到的必是最优解。且由于题目保证了图的连通性,执行结束后无需判断形成的是否是森林。算法的时间复杂度为 O(M⋅α(N))O(M·\alpha(N))O(M⋅α(N)) ,明显优于二分求解。

下面贴代码:

#include <cstdio>
#include <algorithm>
using namespace std;const int MAX_N = 2005;
const int MAX_M = 10005;struct P
{int par;int rank;
};struct Edge
{int u;int v;int cost;bool operator< (const Edge& _Right)const{return cost < _Right.cost;}
};void init(const int N);
int findpar(int x);
bool unite(int x, int y);
bool same(int x, int y);P v[MAX_N];
Edge E[MAX_M];int main()
{int N, M;scanf("%d%d", &N, &M);init(N);for (int i = 0; i < M; ++i){Edge& e = E[i];scanf("%d%d%d", &e.u, &e.v, &e.cost);}sort(E, E + M);int ans = 0;for (int i = 0; i < M; ++i){const Edge& e = E[i];if (unite(e.u, e.v)){ans = e.cost;}}printf("%d\n", ans);return 0;
}void init(const int N)
{for (int i = 0; i <= N; ++i){v[i].par = i;v[i].rank = 0;}
}int findpar(int x)
{if (v[x].par == x){return x;}return v[x].par = findpar(v[x].par);
}bool unite(int x, int y)// 如果合并成功, 返回 true, 否则返回 false
{x = findpar(x);y = findpar(y);if (x != y){if (v[x].rank < v[y].rank){v[x].par = y;}else if (v[x].rank == v[y].rank){v[x].par = y;++v[y].rank;}else{v[y].par = x;}return true;}return false;
}bool same(int x, int y)
{return findpar(x) == findpar(y);
}

POJ2395 Out of Hay - Kruskal算法相关推荐

  1. 数据结构与算法(7-3)最小生成树(普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法)

    目录 一.最小生成树简介 二.普里姆算法(Prim) 1.原理 2.存储 2-1.图顶点和权: 2-3. 最小生成树: 3.Prim()函数 3-1.新顶点入树 3-2.保留最小权 3-3. 找到最小 ...

  2. 基本数据结构(图: 基本结构,DFS,prim算法, kruskal算法)

    #include <iostream> using namespace std; //约定: //1. 图是由很多节点(VERTEX)构成的, 因此图结构是由一个VERTEX的链表构成的, ...

  3. Kruskal算法 - C语言详解

    最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树.  例如,对于如上图G4所示的连通网可以有多棵权值总 ...

  4. 【数据结构】最小生成树 Prim算法 Kruskal算法

    最小生成树应用场景: 假设以下场景,有一块木板,板上钉上一些钉子,这些钉子可以由一些细绳连接起来.假设每个钉子可以通过一根或者多根细绳连接起来,那么一定存在这样得情况,即用最少的细绳把所有的钉子连接起 ...

  5. ds图—最小生成树_Java: Kruskal算法生成最小生成树(邻接矩阵)

    Java: Kruskal算法生成最小生成树(邻接矩阵): package 输出: Kruskal=36: (E,F) (C,D) (D,E) (B,F) (E,G) (A,B) 分析: Java: ...

  6. 生成树的概念,最小生成树Prim算法 Kruskal算法

    求解最小生成树可以用Prim算法 Kruskal算法

  7. Kruskal算法构造最小生成树

    问题[描述算法问题,首选形式化方式(数学语言),其次才是非形式化方式(日常语言)] 在一给定的无向图G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边(即),而 w(u, v) ...

  8. Prim算法和Kruskal算法求最小生成树

    Prim算法 连通分量是指图的一个子图,子图中任意两个顶点之间都是可达的.最小生成树是连通图的一个连通分量,且所有边的权值和最小. 最小生成树中,一个顶点最多与两个顶点邻接:若连通图有n个顶点,则最小 ...

  9. 生成随机数放入整型数组怎么判断有没有重复_图的应用(1)-连通图的最小生成树(Prim算法和Kruskal算法)...

    连通图的生成树: 是一个极小的连通图,它含有图中全部的N个顶点,但是只足以构成一颗树的N-1条边. 必须满足三个条件: 图是连通图: 图中包含了N个结点 图中边的数量等于N-1条. 连通图生成树的判断 ...

最新文章

  1. MySQL 学习笔记(1)— 创建/连接/选择/显示数据库(表) 查询单列(多列/所有列)/查询返回特定的行数 各种排序(单列/多列/降序/组合排序) 过滤数据
  2. 疫情期间,为什么Snapchat比Pinterest更赚钱
  3. 我们用Python分析了B站4万条数据评论,揭秘本山大叔《念诗之王》大热原因!...
  4. FATE HDU - 2159(二维完全背包)
  5. 详细分析 Chrome V8 JIT 漏洞 CVE-2021-21220
  6. 无悔入华夏怎么一直显示服务器,无悔入华夏祭祀玩法怎么玩 无悔入华夏祭祀怎么触发?...
  7. 移动端调试工具-Debuggap
  8. java按钮禁用和启用_在浏览器中禁用(或启用)Java插件
  9. 最终幻想14钓鱼辅助脚本(非外挂)
  10. 真正的英雄(罗纳德·里根在“挑战者号”航天飞机失事后的演讲词)
  11. Java实现Redis批量读取List
  12. 找出若干个非零数中的最小值以及它们的平均值
  13. CodeForces - 999C Alphabetic Removals
  14. springboot点餐微信小程序系统毕业设计源码221144
  15. Flexbox在button/fieldset/legend中(比如safair)失效问题
  16. 小米盒子4c android,小米盒子4/4C规格曝光 有一定升级
  17. 法国计划2020起征收数字税
  18. 以实助实的京东物流,给实体经济带来了什么?
  19. 华为eNSP配置远程ssh
  20. 开源软件OpenBLAS的众筹经历

热门文章

  1. 秋枫学习笔记-原创文章整理
  2. 通过PS制作手机图标心得总结
  3. M1 电脑可以体验Windows11系统吗?M1 MAC安装win11详细教程(附图解)
  4. 如何批量替换文件名称中的指定字符?
  5. 学校招聘行政老师的计算机能力测试,【】计算机教师招聘试题(25页)-原创力文档...
  6. jquery实现左右点击滑动
  7. Picasso之图片缓存机制二ListView篇
  8. UVA - 1103:Ancient Messages
  9. 编程人生(1) 我的软件
  10. Mysql 数据库函数用法大全及示例