P2121 拆地毯kruskal

Posted jason66661010

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P2121 拆地毯kruskal相关的知识,希望对你有一定的参考价值。

题目

https://www.luogu.com.cn/problem/P2121

技术图片

 

 分析

组织者被要求只能保留 K 条地毯,且保留的地毯构成的图中,任意可互相到达的两点间只能有一种方式互相到达:

要构成只有K条边的最大生成树——使用kruskal

代码

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 100002
#define maxm 100002
struct node
{
    int from;
    int to;
    int dis;
}e[maxm*2];
int n, m, k;
int father[maxn];
bool cmp(struct node &a, struct node &b)
{
    return a.dis > b.dis;
}
int find(int x)
{
    if (father[x] == x)return x;
    return father[x] = find(father[x]);
}
int allcount = 0;
int counts = 0;
void kruskal()
{
    sort(e, e + m, cmp);
    for (int i = 0; i < m; i++)
    {
        int tempx = find(e[i].from);
        int tempy = find(e[i].to);
        if (tempx == tempy)continue;
        father[tempx] = tempy;
        allcount += e[i].dis;
        counts++;
        if (counts == k)break;
    }


}

int main()
{
    scanf("%d%d%d", &n, &m, &k);
    for (int i = 0; i < m; i++)
        scanf("%d%d%d", &e[i].from, &e[i].to, &e[i].dis);
    for (int i = 0; i <= m; i++)father[i] = i;
    kruskal();
    printf("%d", allcount);

}

 

以上是关于P2121 拆地毯kruskal的主要内容,如果未能解决你的问题,请参考以下文章

NOIp模拟赛拆地毯

如何将 View 类中的代码片段移动到 OnAppearing() 方法?

Python代码阅读(第25篇):将多行字符串拆分成列表

撸一个拆红包动画

NOIP201105铺地毯

铺地毯蒟蒻题解