首页 > 其他分享 >CF875F Royal Questions

CF875F Royal Questions

时间:2024-05-13 18:18:55浏览次数:22  
标签:vis return CF875F int Royal 一棵树 基环树 fa Questions

传送门

\(a[i]\) 和 \(b[i]\) 之间连一条 \(w[i]\) 的边,相当于把公主当作限制条件。

考虑选当前这条边是否合法:

1.若选了当前这条边后变成了一棵树,那即为 \(x\) 个点和 \(x-1\) 个边,可以任意舍去一个点(因为可以有王子不结婚),所以一定合法。

2.若选了当前这条边后,变成了一棵基环树,即为 \(x\) 个点和 \(x\) 条边,那显然一定合法。

重点在于判选了这条边后是否是一个基环树。考虑仍使用 \(kruskal\) 的方法,排序后依次考虑。若当前的边的两端 \(a,b\) 在同一个树内,那连上这条边会让他变成一个基环树,否则的话会变成一棵树。设 \(vis[i]\) 表示以 \(i\) 为根的集合是树/基环树。 \(vis[i] = 0\) 表示树,反之基环树。

不难得知一棵树和一棵树合并一定会变成一棵树,一棵树和一棵基环树合并会变成一棵基环树。然后在加边的时候按照这个进行判断即可,细节看代码。

#include<bits/stdc++.h>
using namespace std;

const int N = 1e6 + 7;
struct node {
    int a, b, k;
}g[N];
bool cmp(node x, node y) {
    return x.k > y.k;
}
int fa[N], vis[N];
int findfa(int x) {
    if(fa[x] == x) return x;
    return fa[x] = findfa(fa[x]);
}
int main () {
    int n, m;
    cin >> n >> m;
    for(int i = 1; i <= n; i ++) fa[i] = i, vis[i] = 1;
    for(int i = 1; i <= m; i ++) {
        cin >> g[i].a >> g[i].b >> g[i].k;
    }
    sort(g + 1, g + m + 1, cmp);
    int cnt = 0, ans = 0;
    for(int i = 1; i <= m; i ++) {
        int fx = findfa(g[i].a), fy = findfa(g[i].b);
        if(fx != fy) {
            if(vis[fx] == 1 || vis[fy] == 1) {
                fa[fy] = fx;
                if(vis[fx] == 0 || vis[fy] == 0) vis[fx] = 0;
                else vis[fx] = 1;
                ans += g[i].k;
                cnt ++;
            }
        }
        else {
            if(vis[fx]) {
                ans += g[i].k;
                vis[fx] = 0;
                cnt ++;
            }
        }
        if(cnt == n) break;
    }
    cout << ans << endl;
}

标签:vis,return,CF875F,int,Royal,一棵树,基环树,fa,Questions
From: https://www.cnblogs.com/wwyyyy/p/18189751

相关文章

  • How-To-Ask-Questions-The-Smart-Way
    文章转载至github如侵立删https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way提问的智慧HowToAskQuestionsTheSmartWayCopyright©2001,2006,2014EricS.Raymond,RickMoen本指南英文版版权为EricS.Raymond,RickMoen所有。原文网址:http://......
  • Linux Interview questions
    @@用户管理面试题:开机bios自检,检测硬件的问题主板CPU内存硬盘电源在企业中出问题最多的硬件:硬件服务器IDC机房自建机房1.磁盘出了问题怎么办?磁盘的详细属性互联网公司:表现的有经验1).是否在保质期内3年如果保质期3年内,联系售后直接换新的2).过了保质期,......
  • CF566C Logistical Questions
    更好的阅读体验CF566CLogisticalQuestions好强的题,感觉完全想不到。如果对于每个点都计算答案的话复杂度是\(\mathcalO(n^2)\),但是由于题目中给了一个\(\frac{3}{2}\)次方这么一个非常恶心人的东西,这个算法基本没有优化空间,所以考虑换一种思路,先选择一个点,然后尝试对答案......
  • Mac上使用Royal TSX快速连接到OCI主机
    问题:每次使用RoyalTSX连接到OCI主机都要交互式输入opc这个用户名,次数多了也蛮烦。那如何既指定用户名,又想要通过ssh私钥登陆机器呢?这个需求确实很初级,但也着实困扰过我,因为开始我真的以为不支持,认为这两种连接方式只能选其一。结果没想到人家是可以组合使用实现这样的需求。......
  • 无涯教程-PHP Interview Questions函数
    亲爱的读者,这些PHP编程语言面试问题是专门设计的,目的是让您熟悉在采访中可能会遇到的关于PHP编程语言主题的问题的性质。根据我的经验,优秀的面试官几乎不会计划在面试过程中提出任何特定的问题,通常,问题是从该主题的一些基本概念开始的,然后根据进一步的讨论和您的回答继续......
  • Google classic interview questions, throwing eggs the least number of times All
    Googleclassicinterviewquestions,throwingeggstheleastnumberoftimesAllInOne谷歌经典面试题,扔鸡蛋最少次数14✅你在一栋100层的大楼里工作,你得到2个相同的鸡蛋。你需要计算出鸡蛋可以掉落到最高的楼层而不破裂。问题是你需要投掷多少次。找到一种在......
  • Royal Questions题解
    题目链接RoyalQuestions-洛谷|计算机科学教育新生态(luogu.com.cn)分析每个公主会选择两个王子,考虑将每个公主所选择的两个王子连边,边权为该公主的嫁妆选择该边即为选择该公主那么结果图是什么呢?由于每个王子最多只能选择一个公主即每个点最多有1个出边(也可能没有出边......
  • 无涯教程-jQuery Interview Questions函数
    尊敬的读者,这些jQuery面试问题是专门设计的,目的是让您熟悉在您采访jQuery时可能遇到的问题的性质。根据我的经验,优秀的面试官几乎不会计划在面试过程中提出任何特定的问题,通常,问题是从该主题的一些基本概念开始的,然后根据进一步的讨论和您的回答继续进行讨论-Whatisj......
  • Interleaving Retrieval with Chain-of-Thought Reasoning for Knowledge-Intensive M
    目录概IRCoT代码TrivediH.,BalasubramanianN.,KhotT.,SabharwalA.Interleavingretrievalwithchain-of-thoughtreasoningforknowledge-intensivemulti-stepquestions.ACL,2023.概CoT(ChainofThought)+检索.IRCoT对于如上的问题,"Inwhatcountry......
  • FX110曝光:Royal Q APP虚拟骗局
    近期,一位马来西亚汇友爆料称其被引诱在RoyalQAPP加入了投资项目,结果怎么也出不了金。三番两次,盈利却取不出来据汇友描述,他发现自己无意间被一匿名者邀请加入了一个名为“RoyalQTrade”的电报群。在群组里,每天都有很多人晒出大量的盈利截图,晒出来的数据很是刺激眼球。看得多了......