首页 > 其他分享 >I-图的分割(二分+并查集)

I-图的分割(二分+并查集)

时间:2022-11-06 20:58:17浏览次数:75  
标签:二分 分割 return 删除 int 查集 mid check

图的分割


题目大意:

给你n个点,m条边的图,没有重环和自环,所有的点都联通
可以通过删除几条边使得整个图变成两个联通子图
求删除的边中最大边权的最小值


解题思路:

看到“最大边权的最小值”就晓得是经典的二分题目了,所以整体的代码就是二分,现在考虑check()怎么写
(当然边需要经过排序后再去二分)
因为是通过删除几条边而使整个图一分为二,换句话说就是删除边之后的图有两个点集合,那么就可以想到用并查集来维护集合,每次check()时重置集合,将不删除的边连起来,看整个图中有几个集合


代码实现:

#include<bits/stdc++.h>
using namespace std;
// # define int long long
# define endl "\n"
const int N = 1e6+10;
int f[N];
int n,m;
int cnt[N];
struct node{
    int a,b,v;
}a[N];
int find(int x){
    if(f[x] == x) return x;
    return f[x] = find(f[x]);
}
bool check(int mid){
    for(int i = 1;i <= n;++i) f[i] = i,cnt[i] = 1;
    for(int i = mid+1;i<=m;++i)//删除前mid个边,将后面的边连起来
    {
        int x = find(a[i].a);
        int y = find(a[i].b);
        if(x != y){
            if(cnt[x]>cnt[y]) swap(x,y);//启发式合并
            f[x] = y;
        } 
    }
    int cnt = 0;
    for(int i = 1;i <= n;++i)//查看图中有几个集合
    {
        if(f[i] == i) cnt++;
    }
    return cnt>=2;
}

void solve(){
    cin>>n>>m;
  
    for(int i = 1;i <= m;++i){
        cin>>a[i].a>>a[i].b>>a[i].v;

    }
    sort(a+1,a+1+m,[&](node a,node b)->bool{
        return a.v<b.v; 
    });//对边按边权排序
    int l = 1,r = m;
    int ans = 0;
    while(l<=r){
       int mid = l+r>>1;
       if(check(mid)){
           r = mid-1;
           ans = mid;
       }
       else l = mid+1;
   }
    cout<<a[ans].v<<endl;
    
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int tt;
    tt = 1;
//     cin>>tt;
    while(tt--) solve();
    
    
    return 0;
}

标签:二分,分割,return,删除,int,查集,mid,check
From: https://www.cnblogs.com/empty-y/p/16863899.html

相关文章

  • 【模板】并查集 DSU
    postedon2021-09-1215:49:52|under模板|source0x00模板并查集维护的是这样一个问题:\(n\)个点,初始时每个点自己一个集合。\({\ttmerge}(x,y)\):合并\(x,y\)......
  • 704. 二分查找
    704.二分查找给定一个 n 个元素有序的(升序)整型数组 nums和一个目标值 target ,写一个函数搜索 nums 中的target,如果目标值存在返回下标,否则返回-1。示例......
  • Codeforces Round #832 (Div. 2) D (预处理+二分)
    D.YetAnotherProblem观察题干发现一定要是odd考虑发掘性质发现之后还会将[l,r]长度为奇数的区间全部赋值成这个区间的异或和我们设长度为lenlen-1个偶数个异或为......
  • replace() 数学 数学 动规 List<int[]> 数学 二分
    1678.设计Goal解析器returncommand.replace("()","o").replace("(al)","al");888.公平的糖果交换766.托普利茨矩阵只需判断:前行中除最后一个元素外剩余的元......
  • 洛谷P8775 [蓝桥杯 2022 省 A] 青蛙过河 题解 贪心+二分答案
    题目链接​​https://www.luogu.com.cn/problem/P8775​​题目大意小青蛙住在一条河边,它想到河对岸的学校去学习。小青蛙打算经过河里的石头跳到对岸。河里的石头排成了一条......
  • 力扣704 二分查找
    二分查找二分查找概述:BinarySearch,也叫折半查找。折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。 二分查找原理:首先,假设表中元素......
  • 啊哈之 最小生成树,并查集,快速排序
    6924113513463564236457121349132//输出19packagecom.company;importjava.io.FileInputStream;importjava.text.CollationKey......
  • 基本算法篇——二分查找
    基本算法篇——二分查找本次我们介绍基础算法中的二分查找,我们会从下面几个角度来介绍二分查找:二分查找简述二分查找模板二分查找边界例题数的范围二分查找简述首......
  • B - K-th Number HDU - 6231 (二分 尺取)
    WindowsSource2017中国大学生程序设计竞赛-哈尔滨站题意给一个数组,在所有长度大于等于k的区间内,找出第\(k\)大的数,放到另一个数组中,然后在新数组中找到第M大的数。思......
  • 50、实例分割SparseInst模型部署mnn、ncnn、rknn,完成业务需求
    基本思想:看了金东大佬的知乎,羡慕其检测速度和效果,业务存在对实例分割的需求,需要移植嵌入式开发板上,趁国庆节休息几天,搞一下几个例子,部署一下 一、下载官方代码,测试一下 首......