[ luogu ] P111 修理公路

题目背景

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

题目描述

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

输入输出格式

输入格式:

第1行两个正整数N,M

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

输出格式:

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

输入输出样例

输入样例#1:

4 4
1 2 6
1 3 4
1 4 5
4 2 3

输出样例#1:

5

说明

N<=1000,M<=100000

x<=N,y<=N,t<=100000

不知道怎么弄链接,

只好把原题网站放在了评论中= =

详细内容

见下面(本弱打的代码,可能有些多余的东西,不要介意= =)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 struct f{int x,y,t;} a[100050];
 4
 5   int cmp(f a,f b)//自定义排列结构体,时间由短到长排序
 6 {
 7      if(a.t!=b.t)
 8         return a.t<b.t;
 9      else
10         return a.x<b.x;
11 }
12 int n,m;
13 int root[10500],size[10500];//root代表空间,把相互连通的道路编入一个空间里
14                             //size代表数量,当一个房间数量与总数相同时,所有道路连通
15    int find(int x)
16 {
17      if(root[x]!=x)//当该道路的空间不属于它本身时,寻找它所属的空间
18        root[x]=find(root[x]);
19          return root[x];
20 }
21
22 int main()
23 {
24       cin>>n>>m;//n代表村庄总数,m代表指令的数量
25     for(int i=1;i<=m;i++)
26        cin>>a[i].x>>a[i].y>>a[i].t;//输入题目中的两个村庄(x,y)和时间(t)
27
28     sort(a+1,a+1+m,cmp);//上面所写到的排序
29
30 for(int i=1;i<=n;i++)
31 {
32      root[i]=i;
33      size[i]=1;
34 }//初始化定义每个村庄空间属于自己,空间数量为1
35
36 int l=1;
37 while(l<=m)//从第一条指令开始读入
38 { int q,p;
39   q=a[l].x;
40   p=a[l].y;
41   int rq,rp;//rq,rp代表p和q所在的空间
42   rq=find(q);rp=find(p);
43   if(rq!=rp)//当两个村庄空间不同的时候,合并起来,数量集中在一个空间中
44  {root[rq]=root[rp];
45   size[rp]+=size[rq];
46   size[rq]=0;//清零,防止出事
47   if(size[rp]==n)//当一个房间数量与总数相同时,所有道路连通
48   {cout<<a[l].t;break;}}
49   if(l==m)//如果满足题意,上面已经退出= =
50   {cout<<-1;break;}
51    l++;}
52
53   return 0;
54 }
时间: 2024-08-26 04:32:56

[ luogu ] P111 修理公路的相关文章

修复公路

https://www.luogu.org/problem/show?pid=1111 题目背景 A地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车.政府派人修复这些公路. 题目描述 给出A地区的村庄数N,和公路数M,公路是双向的.并告诉你每条公路的连着哪两个村庄,并告诉你什么时候能修完这条公路.问最早什么时候任意两个村庄能够通车,即最早什么时候任意两条村庄都存在至少一条修复完成的道路(可以由多条公路连成一条道路) 输入输出格式 输入格式: 第1行两个正整数N,M 下面M行,每行3个正整

洛谷1265 公路修建

本题地址:http://www.luogu.org/problem/show?pid=1265 题目描述 某国有n个城市,它们互相之间没有公路相通,因此交通十分不便.为解决这一“行路难”的问题,政府决定修建公路.修建公路的任务由各城市共同完成.     修建工程分若干轮完成.在每一轮中,每个城市选择一个与它最近的城市,申请修建通往该城市的公路.政府负责审批这些申请以决定是否同意修建.     政府审批的规则如下:     (1)如果两个或以上城市申请修建同一条公路,则让它们共同修建:     (

luogu题解 UVA1615 【Highway】

题目链接: https://www.luogu.org/problemnew/show/UVA1615 分析: 首先这里的距离是欧几里得距离而不是曼哈顿距离. 然后我们对于每个点,求出在公路上保持D范围内最远的两个端点,这两个端点构成一个区间,我们要做的就是选出尽量少的点使所有区间至少有一个点,就是典型的区间选点问题. 怎么做呢?把所有区间右端点从小到大排序,如果右端点相同左端点小的在前面. 达到贪心的目的,我们设一个pos=-inf,然后遍历所有区间,如果pos>该区间左端点,cnt+1,po

luogu P3799 妖梦拼木棒

二次联通门 : luogu P3799 妖梦拼木棒 /* luogu P3799 妖梦拼木棒 用一个桶存下所有的木棒 美剧两根短的木棒长度 后随便乘一乘就 好了.. */ #include <algorithm> #include <cstdio> #define Mod 1000000007 #define Max 5000 void read (int &now) { now = 0; register char word = getchar (); while (wo

[luogu P1967][NOIp2013]P1967 货车运输

题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物. 输入输出格式 输入格式: 输入文件名为 truck.in. 输入文件第一行有两个用一个空格隔开的整数 n,m,表示 A 国有 n 座城市和 m 条道 路. 接下来 m 行每行 3 个整数 x. y. z,每两个整数之间用一个空格隔开,表示从 x 号城市到 y 号城市有一条限重为 z

luogu 3126 回文的路径

https://www.luogu.org/problem/show?pid=3126 考虑dp,从两头走到中间. f[i][j][k][l]表示从左上角走到(i,j),从右下角走到(k,l),路径长度相等,所经过路径相同的方案数. 方程不再赘述. 考虑步数要相同,所以只要枚举步数和行就好. f[i][j][k]表示第一个点在第j行,第2个点在第k行,走i步的方案数. 所以得出方程f[i][j][k]=(f[i-1][j-1][k]+f[i-1][j][k+1]+f[i-1][j-1][k+1]

luogu P2018 消息传递

二次联通门 : luogu P2018 消息传递 /* luogu P2018 消息传递 树形dp 原来用优先队列做了一下, T了俩点 MMP 去看正解.. 复杂度一样好不好.. 每次到达一个点,记录其子树中所有的dp值 优先向大的一边转移 */ #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #define INF 1e8 const int BUF

luogu P1966 火柴排队

二次联通门 : luogu P1966 火柴排队 /* luogu P1966 火柴排队 神TM逆序对... noip怎么这么坑啊.. 暴力都没得打 此题模拟考试时爆了0 做法 将A数组排序,由于B数组与A数组是一一对应的 那么B数组的位置也会发生相应的变化 此时B数组逆序数对数即为答案 */ #include <cstdio> #include <iostream> #include <algorithm> const int BUF = 123123123; cha

luogu P1941 飞扬的小鸟

二次联通门 : luogu P1941 飞扬的小鸟 /* luogu P1941 飞扬的小鸟 dp 向上飞是完全背包,向下掉就是01背包 分情况讨论一下 最后合并一下 */ #include <cstdio> #include <iostream> #include <cstring> const int BUF = 123123123; char Buf[BUF], *buf = Buf; inline void read (int &now) { for (