zoukankan      html  css  js  c++  java
  • [ 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 }
  • 相关阅读:
    LintCode-174.删除链表中倒数第n个节点
    LintCode-165.合并两个排序链表
    LintCode-371.用递归打印数字
    LintCode-140.快速幂
    LintCode-373.奇偶分割数组
    NOI 2015 品酒大会 (后缀数组+并查集)
    NOI 2016 优秀的拆分 (后缀数组+差分)
    POJ 2774 Long Long Message (后缀数组+二分)
    BZOJ 1717 [USACO06DEC] Milk Patterns (后缀数组+二分)
    POJ 1743 [USACO5.1] Musical Theme (后缀数组+二分)
  • 原文地址:https://www.cnblogs.com/lyyl/p/7222619.html
Copyright © 2011-2022 走看看