修复公路题解

修复公路题解修复公路题目题目背景 AAA 地区在地震过后 连接所有村庄的公路都造成了损坏而无法通车 政府派人修复这些公路 题目描述给出 A 地区的村庄数 NNN 和公路数 MMM 公路是双向的 并告诉你每条公路的连着哪两个村庄 并告诉你什么时候能修完这条公路 问最早什么时候任意两个村庄能够通车 即最早什么时候任意两条村庄都存在至少一条修复完成的道路 可以由多条公路连成一条道路 输入格式第 111 行两个正整数 NNN 下面 MMM 行 每行 333 个正整数 x y tx y tx y t 告诉你这条公路连着 x yx yx y 两个村

修复公路

题目

题目背景

A A A地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车。政府派人修复这些公路。

题目描述

给出A地区的村庄数 N N N,和公路数 M M M,公路是双向的。并告诉你每条公路的连着哪两个村庄,并告诉你什么时候能修完这条公路。问最早什么时候任意两个村庄能够通车,即最早什么时候任意两条村庄都存在至少一条修复完成的道路(可以由多条公路连成一条道路)

输入格式

1 1 1行两个正整数 N N N
下面 M M M行,每行 3 3 3个正整数 x , y , t x,y,t x,y,t,告诉你这条公路连着 x , y x,y x,y两个村庄,在时间t时能修复完成这条公路。

输出格式

如果全部公路修复完毕仍然存在两个村庄无法通车,则输出 − 1 -1 1,否则输出最早什么时候任意两个村庄能够通车。

输入输出样例

输入#1
4 4 1 2 6 1 3 4 1 4 5 4 2 3 
输出#1
5 

说明/提示

N ≤ 1000 , M ≤ N≤1000,M≤ N1000,M100000
x ≤ N , y ≤ N , t ≤ x≤N,y≤N,t≤ xN,yN,t100000

原题链接

题解

思路

这道题知道的人很容易看出, 其实就是最小生成树的改版。如果要连接所有的村庄, 我们不难得出, 至少要 N − 1 N – 1 N1条边, 然后就可以推出了, 因为最少只需 N − 1 N – 1 N1条边, 所以比 N − 1 N – 1 N1多的边都是没有用的, 那么我们只需要找到和最小且能联通所有村庄的 N − 1 N – 1 N1条边。

运用算法

K r u s k a l Kruskal Kruskal

代码

#include  
     #include  
     using namespace std; #define MAXN 1000 #define MAXM  int father[MAXN + 5];//记录父节点实现并查集 int sum = 0;//累加生成树的边数, 用来判断是否能构成 struct node{ 
    int a, b, n; }s[MAXM + 5];//存储每边的信息 int find (int x){ 
   //查找祖先 if (father[x] != x){ 
    father[x] = find (father[x]);//路径压缩 } return father[x];//以将父节点置为了根节点,直接返回 } int op (int x, int y, int n){ 
   //判断此边是否可以加入生成树 int a = find (x), b = find (y);//先分别查找两节点的祖先节点 if (a != b){ 
   //如果祖先不一样 sum ++;//记录生成树里多了一条边 father[a] = b;//并连接两个并查集 return n;//返回此边时间 } else{ 
   //如果加入生成树后会构成环 return -1;//返回-1,表示不能加入 } } bool cmp (node a, node b){ 
   //用来按照边的建好时间来排序边 //时间短的排前面 if (a.n > b.n){ 
    return 0; } else{ 
    return 1; } } int main(){ 
    int n, m; int ans; //输入数据 scanf ("%d %d", &n, &m); for (int i = 1; i <= m; i++){ 
    scanf ("%d %d %d", &s[i].a, &s[i].b, &s[i].n); } //初始化并查集与边的顺序 for (int i = 1; i <= n; i++){ 
    father[i] = i; } sort (s + 1, s + 1 + m, cmp); //依次插入边 for (int i = 1; i <= m && sum <= n - 1; i++){ 
    int x = op (s[i].a, s[i].b, s[i].n); if (x != -1){ 
    ans = x; } } //判断是否满足任意两个节点之间都能到达 if (sum < n - 1){ 
    printf ("-1"); return 0; } else{ 
    printf ("%d", ans); return 0; } }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/212365.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午8:12
下一篇 2026年3月18日 下午8:13


相关推荐

  • MySQL中tinytext、text、mediumtext和longtext详解

    MySQL中tinytext、text、mediumtext和longtext详解一、字符串类型 类型 范围 说明 Char(N)[binary] N=1~255个字节(4.1以下版本) N=1~65535个字节(4.1以下版本) binary:分辨大小写 固定长度 std_namecahr(32)notnull VarChar(N)…

    2022年4月30日
    217
  • 如何搭建www服务器_网站服务器

    如何搭建www服务器_网站服务器更多内容参见个人技术博客,无广告欢迎关注搭建自己的服务器,过程大致分为3步:*购买服务器,配置系统环境*获得域名* CA认证1、购买服务器,配置系统环境经过比较,阿里云、腾讯

    2022年8月4日
    11
  • 爱玩吧提供10G国外免费PHP空间「建议收藏」

    爱玩吧提供10G国外免费PHP空间「建议收藏」爱玩吧提供10G国外免费PHP空间爱玩吧香港空间:不再开放免费空间申请。大家就去用免费国外不限制空间申请Yhfx.ml免费空间服务由idc.aiwanba.net提供 免费空间套餐每月流量 100GB空间容量10GB控制面板演示

    2026年2月6日
    6
  • 电驴怎么显示服务器列表,(转)如何更新电驴服务器列表(eMule Server List)

    电驴怎么显示服务器列表,(转)如何更新电驴服务器列表(eMule Server List)电驴上的丰富资源让我们眼馋,尤其是一些国外的大片资源。但是往往出现不能下载的情况。其实原因就是出在电驴服务器列表上,我们常用的电驴服务器列表都是www.emule.org.cn提供的他并不包含一些国外的服务器列表,所以就引起了某些国外资源下载不了。其实只要大家更新一下电驴服务器列表就可以解决这个小问题。上哪去找电驴服务器列表呢?当然有网站为我们做好了服务,ed2k.2x4u.de就是这样的一个网站…

    2022年6月22日
    74
  • iphone 相册权限没办法开启_苹果请求访问App将在此处显示

    iphone 相册权限没办法开启_苹果请求访问App将在此处显示一:打开相册不提示用户权限问题描述:iOS11已经在plist文件中写了相关权限设置,但是在使用UIImagePickerController打开相册的时候却不提示用户选择权限,有以下几条情况:UIImagePickerController同样的设置使用相机会有权限选择提示,设置中也没有关于相册的设置;项目中有用到TZImagePickerCont…

    2026年2月13日
    7
  • 基于视觉的肢体动作捕捉

    基于视觉的肢体动作捕捉

    2026年3月15日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号