一个很神奇的Kruskal算法题解
比赛首页 > B 道路建设 > 50205541
随着如今社会的不断变化,交通问题也变得越来越重要,所以市长决定建设一些公路来方便各个城市之间的贸易和交易。虽然市长的想法很好,但是他也遇到了一般人也经常头疼的问题,那就是手头的经费有限……在规划过程中,设计师们已经预算出部分城市之间建设公路的经费需求。现在市长想知道,它能不能将他的m个城市在有限的经费内实现公路交通。如果可以的话,输出Yes,否则输出No(两个城市不一定要直接的公路相连,间接公路到达也可以。)
Kruskal算法
1.先将所有边按权重从小到大排序,
2.枚举每条边a,b权重是c。如果ab不连通,把ab这条边加到集合里面来
#include#define vi vector using namespace std; using ll = long long; using ld = long double; const int inf = 0x3f3f3f3f; const ll N = 1e5; ll a[N]; ll c,n,m,i,cnt,ans; /*Kruskal算法:贪心选取最短的边来组成呢一颗最小的生成树 +并查集 */ int main() { ios_base::sync_with_stdio(false); cin.tie(0);cout.tie(0); cin>>c>>n>>m; int ct[m+1]; memset(ct,inf,sizeof(ct)); for(int i=0;i ) { int v1,v2,h; cin>>v1>>v2>>h; ct[v2] = min(ct[v2],h); } for(i=1;i<=m&&cnt<2;i++) { if(ct[i]==inf) { cnt++; } else { ans+=ct[i]; } } if(cnt==2||ans>c) { puts("No"); } else if(ans<=c) { puts("Yes"); } return 0; }