当前位置: 首页 > news >正文

P2619 [国家集训队] Tree I

题目传送门
前置知识:最小生成树

分析

对于 kruskal 算法,是对边权排序,然后依次判环然后加边。
但是这里有是限制的,我们跑出来最小生成树不一定是有 needneedneed 条白边的最小生成树。
那怎么办?
比如白边数量大于 needneedneed,多余的白边是什么到前面去的?因为 kruskal 的排序,那么这下知道怎么解决了,我们统一将所有白边的权值加上一个数 xxx,白边的权值变大了,排序时后面的权值较小黑边就到了前面,这样就可以减少白边数量,最后再将在最小生成树中加上的白边的权值 n⋅needn\cdot neednneed 减去就行了。
那么这个加上的值怎么求?
因为有可能白边数量过少,就需要加负数,所以最小值应该是 −100-100100 ,过多就加整数,最大值为 100100100 (见题目数据范围)
xxx 的值就在 −100-100100100100100 之间,是线性且有序的,那么想到了什么?
二分。

实现

xxx 进行二分,然后将所有白边加上一个值 midmidmid ,包最小生成树,记录白边数量,如果大了就往大的二分,小了就往小的二分。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-'0',c=getchar();return x*f;
}
void print(int x){if(x<0)putchar('-'),x=-x;if(x<10){putchar(x+'0');return;}print(x/10);putchar(x%10+'0');
}
void putstr(string s){for(int i=0;i<s.size();i++)putchar(s[i]);
}
int n,m,k;
int f[N];
int find(int x){if(x!=f[x])f[x]=find(f[x]);return f[x];
}
struct node{int u,v,w,c;
};
node a[N];
bool cmp(node a,node b){return a.w<b.w||(a.w==b.w&&a.c<b.c);
}
int ans;
int kru(){sort(a+1,a+1+m,cmp);int sum=0;ans=0;for(int i=1;i<=m;i++){int u=a[i].u;int v=a[i].v;int w=a[i].w;int c=a[i].c;if(find(u)==find(v))continue;f[find(u)]=find(v);ans+=1-c;sum+=w;}return sum;
}
signed main(){//ios::sync_with_stdio(0);n=read(),m=read(),k=read();for(int i=1;i<=m;i++){int u=read()+1,v=read()+1,w=read(),c=read();a[i]=node{u,v,w,c};}int l=-100,r=100;int answer;int mid;while(l<r){mid=l+r>>1;for(int i=0;i<=n;i++)f[i]=i;for(int i=1;i<=m;i++)if(!a[i].c)a[i].w+=mid;int sum=kru();if(ans<k)r=mid-1;else l=mid+1,answer=sum-k*mid;for(int i=1;i<=m;i++)if(!a[i].c)a[i].w-=mid;}print(answer);
}
http://www.dtcms.com/a/275998.html

相关文章:

  • 【Datawhale AI夏令营】Task2 笔记:MCP Server开发的重难点
  • 【LeetCode 热题 100】98. 验证二叉搜索树——(解法一)前序遍历
  • Python 三大高频标准库实战指南——json · datetime · random 深度解析
  • 【Java入门到精通】(二)Java基础语法(上)
  • 27. 移除元素
  • 【android bluetooth 协议分析 07】【SDP详解 1】【SDP 介绍】
  • 19th Day| 530.二叉搜索树的最小绝对差,501.二叉搜索树中的众数, 236.二叉树的最近公共祖先
  • springboot3X 整合高版本mybatisplus
  • pyqt5绘制矩形和线条
  • 【从零开始编写数据库:基于Python语言实现数据库ToyDB的ACID特性】
  • C语言<数据结构-单链表>(收尾)
  • Windows 开启和关闭 Administrator 用户的方法
  • 软考高级系系统分师和架构师常考知识点总结三
  • Typecho博客系统与WebSocket实时通信整合指南
  • 网络安全初级--搭建
  • GPU编程入门:CUDA与OpenCL全面解析
  • 聊下easyexcel导出
  • 岛屿数量问题
  • [爬虫实战] 多进程/多线程/协程-异步爬取豆瓣Top250
  • 小架构step系列12:单元测试
  • 【LeetCode】算法详解#8 ---螺旋矩阵
  • Linux->基础IO
  • 佩戴头盔数据集,5498张图片,平均识别率95.3% 其中戴头盔的图有2348张,支持yolo,coco json, pasical voc xml格式的标注
  • Ansible 入门指南:自动化配置管理核心技术与实战 SELinux 配置
  • day051-ansible循环、判断与jinja2模板
  • Frida绕过SSL Pinning (证书绑定)抓包;Frida注入;app无法抓包问题解决。
  • Spring之【写一个简单的IOC容器EasySpring】
  • 2025年亚太杯(中文赛项)数学建模B题【疾病的预测与大数据分析】原创论文分享
  • UE5多人MOBA+GAS 19、创建升龙技能,以及带力的被动,为升龙技能添加冷却和消耗
  • 3. java 堆和 JVM 内存结构