B.道路建设
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 65536K,其他语言131072K
64bit IO Format: %lld
空间限制: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 */