Kruskal模板

Kruskal

用来求最小生成树的,把所有边放进小根堆,依次取出,要是不会和现有的最小生成树形成环路,就把这个边加入最小生成树

下方的是板子,顺便体现了怎么记录一个并不联通的图最小生成树后还剩几个类

ll bingchaji[10000000] = {0};
     ll find(ll x)
     {
          return x == bingchaji[x] ? x : bingchaji[x] = find(bingchaji[x]);//第二个是返回赋的值
     }

     priority_queue<pair<ll, pair<ll, ll>>> v;
     for (ll i = 0; i < m; i++)
     {
          ll a, b, c;
          cin >> a >> b >> c;
          v.push(pair<ll, pair<ll, ll>>(-c, pair<ll, ll>(a, b))); //创建小根堆,权重是c,从a到b的边
     }

     for (ll i = 1; i <= n; i++) //初始化并查集
     {
          bingchaji[i] = i;
     }

     ll tn = n; //记录还有几个类簇,最开始是点的数量
     for (ll i = 0; i < n; i++)
     {
          ll c = v.top().first;
          ll a = v.top().second.first;
          ll b = v.top().second.second;
          v.pop();
          ll k = find(a);
          ll kk = find(b);
          if (k != kk) //能形成环路就不要添加了
          {
               bingchaji[kk] = k; //合并节点
               tn--;
          }
     }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值