空间限制: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。
输入
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
输入
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 */