• 图的最小生成树 (并查集)


    道路建设

    题目描述

    随着如今社会的不断变化,交通问题也变得越来越重要,所以市长决定建设一些公路来方便各个城市之间的贸易和交易。虽然市长的想法很好,但是他也遇到了一般人也经常头疼的问题,那就是手头的经费有限……在规划过程中,设计师们已经预算出部分城市之间建设公路的经费需求。现在市长想知道,它能不能将他的m个城市在有限的经费内实现公路交通。如果可以的话,输出Yes,否则输出No(两个城市不一定要直接的公路相连,间接公路到达也可以。)

    输入描述:

    测试输入包含多条测试数据
    每个测试数据的第1行分别给出可用的经费c(<1000000),道路数目n(n<10000),以及城市数目m(<100)。
    接下来的n行给出建立公路的成本信息,每行给出三个整数,分别是相连的两个城市v1、v2(0<v1,v2<=m)以及建设公路所需的成本h(h<100)。

    输出描述:

    对每个测试用例,输出Yes或No。

    示例1

    输入

    20 10 5
    1 2 6
    1 3 3
    1 4 4
    1 5 5
    2 3 7
    2 4 7
    2 5 8
    3 4 6
    3 5 9
    4 5 2

    输出

    Yes

    示例2

    输入

    10 2 2
    1 2 5
    1 2 15

    输出

    Yes

    备注:

    两个城市之间可能存在多条线路


    思路:图的最小生成树模板题......

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<algorithm>
     6 #include<map>
     7 #include<set>
     8 #include<vector>
     9 using namespace std;
    10 #define ll long long
    11 const int inf=99999999;
    12 const int mod=1e9+7;
    13 const int maxn=1e4+10; 
    14 typedef struct 
    15 {
    16     int u;
    17     int v;
    18     int w;
    19 } St;
    20 St e[maxn];
    21 int n,m;//n个点,m条边 
    22 bool cmp(const St &a,const St &b)
    23 {
    24     return a.w < b.w;
    25 } 
    26 int f[maxn];
    27 void init(int n)
    28 {
    29     for(int i=0;i<=n+1;i++)
    30         f[i]=i;
    31 }
    32 int getf(int v)
    33 {
    34     if(f[v]==v)
    35         return v;
    36     else
    37     {
    38         f[v]=getf(f[v]);
    39         return f[v];
    40     }
    41 }
    42 int merge(int u,int v)
    43 {
    44     int t1=getf(u);
    45     int t2=getf(v);
    46     if(t1!=t2)//两个点未连通 
    47     {
    48         f[t2]=t1;
    49         return 1;
    50     }
    51     return 0;
    52 }
    53 int main()
    54 {
    55     ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); 
    56     int limit;
    57     while(cin>>limit>>m>>n)//注意题意先输入边数目再输入点数目 
    58     {
    59         for(int i=1;i<=m;i++)
    60             cin>>e[i].u>>e[i].v>>e[i].w;
    61         sort(e+1,e+m+1,cmp);//先排序,按权值从小到大合并边 
    62         init(n);
    63         int sum=0,count=0;//sum为权值,count为边数 
    64         for(int i=1;i<=m;i++)
    65         {
    66             if(merge(e[i].u,e[i].v))//可以合并 
    67             {
    68                 count++; 
    69                 sum+=e[i].w;
    70             }
    71             if(count==n-1)//已经连通1到n 
    72                 break;
    73         }
    74         int flag=1;
    75         if(count==n-1)
    76         {
    77             if(sum<=limit)
    78             {
    79                 printf("Yes
    ");
    80                 flag=0;
    81             }
    82         }
    83         if(flag)//没有连通n个点之间n-1条边,以及经费超出都不行 
    84             printf("No
    ");
    85     }
    86         return 0;
    87 }
    
    
    
    
     
    大佬见笑,,
  • 相关阅读:
    第二面某知科技的
    面试的提问和大致经过
    抓取菜鸟教程中python内置函数的关键字和链接
    记录下之前写的udp,tcp。很浅显
    python连接mongodb数据库操作
    生成随机字母或数字
    python连接mysql基本操作
    post登录请求
    文件的读写
    request,正则爬虫
  • 原文地址:https://www.cnblogs.com/xwl3109377858/p/10908410.html
Copyright © 2020-2023  润新知