牛客网 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 */
原文地址:https://www.cnblogs.com/ZERO-/p/9711277.html