• 牛客网 2018年全国多校算法寒假训练营练习比赛(第四场) B.道路建设-最小生成树(Prim)


    B.道路建设
     
    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 65536K,其他语言131072K
    64bit IO Format: %lld

    题目描述

    随着如今社会的不断变化,交通问题也变得越来越重要,所以市长决定建设一些公路来方便各个城市之间的贸易和交易。虽然市长的想法很好,但是他也遇到了一般人也经常头疼的问题,那就是手头的经费有限……在规划过程中,设计师们已经预算出部分城市之间建设公路的经费需求。现在市长想知道,它能不能将他的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

    备注:

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



    这个题本咸鱼简直想打人,写了一直wa83.33%,要判断能不能生成树(判断的话就是看每个城市是不是都有路),然后再乱写才可以。。。

    我简直是个傻子,我发现我以前的板子都有毒,初始化都有问题(;д;),导致我一直都是wa83.33%,现在改好了。。。

    代码:

     1 //B-最小生成树
     2 #include<iostream>
     3 #include<cstring>
     4 #include<stdio.h>
     5 #include<cmath>
     6 #include<algorithm>
     7 #include<stdlib.h>
     8 using namespace std;
     9 const int N=100+10;
    10 const int INF=1e6+10;
    11 int  mp[N][N];
    12 int vis[N],dis[N];
    13 int n,u,v,w,money,m;
    14 void prim(){
    15     memset(vis,0,sizeof(vis));
    16     for(int i=1;i<=n;i++)dis[i]=mp[1][i];
    17     int pos=0;
    18     vis[1]=1;
    19     dis[1]=0;
    20     for(int i=1;i<=n-1;i++){
    21         int minn=INF;
    22         for(int j=1;j<=n;j++){
    23             if(!vis[j]&&minn>dis[j]){
    24                 pos=j;
    25                 minn=dis[j];
    26             }
    27         }
    28         vis[pos]=1;
    29         for(int j=1;j<=n;j++){
    30             if(!vis[j]&&dis[j]>mp[pos][j])dis[j]=mp[pos][j];
    31         }
    32     }
    33     int flag=0,ans=0;
    34     for(int i=1;i<=n;i++){
    35         if(dis[i]==INF)flag=1;
    36         ans+=dis[i];
    37     }
    38     if(ans>money)flag=1;
    39     if(flag==0)cout<<"Yes"<<endl;
    40     else cout<<"No"<<endl;
    41 }
    42 int main(){
    43     scanf("%d%d%d",&money,&m,&n);
    44         for(int i=1;i<=n;i++)
    45             for(int j=1;j<=n;j++)mp[i][j]=INF;
    46         for(int i=1;i<=m;i++){
    47             scanf("%d%d%d",&u,&v,&w);
    48             mp[u][v]=min(mp[u][v],w);          //因为没有方向,所以要这么写。
    49             mp[v][u]=w;
    50         }
    51         prim();
    52     return 0;
    53 }
    54 
    55 /*
    56 20 10 5
    57 1 2 6
    58 1 3 3
    59 1 4 4
    60 1 5 5
    61 2 3 7
    62 2 4 7
    63 2 5 8
    64 3 4 6
    65 3 5 9
    66 4 5 2
    67 */
  • 相关阅读:
    Oracle 添加主键和索引
    Oracle中查询主键、外键、sequence、表基本信息等
    Spring工作原理
    Ehcache 缓存使用
    socket编程-java
    oracle触发器详解
    单例模式的几种写法
    [LeetCode] 412. Fizz Buzz 嘶嘶嗡嗡
    LeetCode Top Interview Questions
    [LeetCode] 131. Palindrome Partitioning 回文分割
  • 原文地址:https://www.cnblogs.com/ZERO-/p/9711277.html
Copyright © 2020-2023  润新知