一个很神奇的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;
}