[ 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 }
原文地址:https://www.cnblogs.com/lyyl/p/7222619.html