题目描述

原题来自:2012 年国家集训队互测

给你一个无向带权连通图,每条边是黑色或白色。让你求一棵最小权的恰好有 need 条白色边的生成树。题目保证有解。

输入格式

第一行 V,E,need 分别表示点数,边数和需要的白色边数。

接下来 E 行,每行 s,t,c,col 表示这边的端点(点从 0 开始标号),边权,颜色( 0白色,1 黑色)。

输出格式

一行表示所求生成树的边权和。

样例

样例输入

2 2 1
0 1 1 1
0 1 2 0

样例输出

2

数据范围与提示

对于所有数据,V<=5e4,E<=1e5边权为 [ 1,100 ] 中的正整数。

___________________________________________________

想要加入的边数刚好是need条,需要在边上附加权值,控制加入的多少。

所以二分增加的权值,让后最小生成树。

本来很简单,但是刚开始的方法是当条数为need时统计加权以前的边的权值之和,这样会出现所有白边黑白等长而由于白边在前,从而无法取到黑边,白边又超过need的情况,无法解决。所以改为统计加权前的边的和再减去增加权乘以need的积,答案正确。为什么need条数不对还正确呢?因为黑白边等长!!!

___________________________________________________

 1 #include<bits/stdc++.h>
2 using namespace std;
3 const int maxn=5e4+10;
4 const int maxm=1e5+10;
5 int n,m,need;
6 struct edge
7 {
8 int u,v,w,ww,c;
9 }e[maxm];
10 bool cmp(edge a,edge b)
11 {
12 return a.ww==b.ww?a.c<b.c:a.ww<b.ww;
13 }
14 int fa[maxm];
15 int find(int x)
16 {
17 return fa[x]==x?x:fa[x]=find(fa[x]);
18 }
19 int ans;
20 int pd(int x)
21 {
22 for(int i=0;i<m;++i)e[i].ww=e[i].w+(e[i].c==0?x:0);
23 sort(e,e+m,cmp);
24 for(int i=1;i<=n;++i)fa[i]=i;
25 ans=0;
26 int cntb=0,cnt=0;
27 for(int i=0;i<m;++i)
28 {
29 int a=find(e[i].u),b=find(e[i].v);
30 if(a!=b)
31 {
32 cnt++;
33 ans+=e[i].ww;
34 fa[a]=b;
35 if(e[i].c==0)cntb++;
36 if(cnt==n-1)break;
37 }
38 }
39 return cntb;
40 }
41 int da;
42 int main()
43 {
44 scanf("%d%d%d",&n,&m,&need);
45 for(int i=0;i<m;++i)
46 {
47 scanf("%d%d%d%d",&e[i].u,&e[i].v,&e[i].w,&e[i].c);
48 e[i].u++;
49 e[i].v++;
50 }
51 int l=-101,r=101;
52 while(l<=r)
53 {
54 int mid=(l+r)>>1,tf=pd(mid);
55 if(tf>=need)
56 {
57 l=mid+1;
58 da=ans-need*mid;
59 }
60 else
61 {
62 r=mid-1;
63 }
64 }
65 cout<<da;
66 return 0;
67 }

LOJ10069 TREE的更多相关文章

  1. [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法

    二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...

  2. SAP CRM 树视图(TREE VIEW)

    树视图可以用于表示数据的层次. 例如:SAP CRM中的组织结构数据可以表示为树视图. 在SAP CRM Web UI的术语当中,没有像表视图(table view)或者表单视图(form view) ...

  3. 无限分级和tree结构数据增删改【提供Demo下载】

    无限分级 很多时候我们不确定等级关系的层级,这个时候就需要用到无限分级了. 说到无限分级,又要扯到递归调用了.(据说频繁递归是很耗性能的),在此我们需要先设计好表机构,用来存储无限分级的数据.当然,以 ...

  4. 2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...

  5. Leetcode 笔记 110 - Balanced Binary Tree

    题目链接:Balanced Binary Tree | LeetCode OJ Given a binary tree, determine if it is height-balanced. For ...

  6. Leetcode 笔记 100 - Same Tree

    题目链接:Same Tree | LeetCode OJ Given two binary trees, write a function to check if they are equal or ...

  7. Leetcode 笔记 99 - Recover Binary Search Tree

    题目链接:Recover Binary Search Tree | LeetCode OJ Two elements of a binary search tree (BST) are swapped ...

  8. Leetcode 笔记 98 - Validate Binary Search Tree

    题目链接:Validate Binary Search Tree | LeetCode OJ Given a binary tree, determine if it is a valid binar ...

  9. Leetcode 笔记 101 - Symmetric Tree

    题目链接:Symmetric Tree | LeetCode OJ Given a binary tree, check whether it is a mirror of itself (ie, s ...

随机推荐

  1. intellij IDEA Mybatis入门案例

    最近打算学习ssm框架  Mybatis 作为入门的第一个持久层框架,学习起来实在费劲.故写此文章作为入门案例. 先打开 IDEA建立一个Maven项目,目录结构如下: 源代码已经上传至GitHub ...

  2. Maven仓库是什么

    Maven仓库是基于简单文件系统存储的,集中化管理Java API资源(构件)的一个服务.仓库中的任何一个构件都有其唯一的坐标,根据这个坐标可以定义其在仓库中的唯一存储路径.得益于 Maven 的坐标 ...

  3. Scrum转型(二) Scrum的角色

    1.1 ScurmMaster 作为Scrum流程的捍卫者和布道者,ScrumMaster在Scrum团队中起到至关重要的作用,他们确保团队使用正确的流程,确保团队正确地召开各种会议,他们训练团队的敏 ...

  4. cmake - 可执行文件

    1.生成可执行文件 add_executable(hello xxx.cpp xxxxx.cpp) ##根据文件xxx.cpp和xxxx.cpp生成可执行文件hello,但是这两个可执行文件如果依赖其 ...

  5. html 垂直并列显示

    笔者在制作登陆网页的时候,发现让input居中十分困难,笔者在网上搜了好久都没有结果,所以就想出了一个硬核的纯html的解决方法 直接上代码: <div style="text-ali ...

  6. Databricks 第5篇:Databricks文件系统(DBFS)

    Databricks 文件系统 (DBFS,Databricks File System) 是一个装载到 Azure Databricks 工作区的分布式文件系统,可以在 Azure Databric ...

  7. 讲讲Java8的Optional类

    前言 Java 8中引入了 Optional 类来解决 NullPointerException 与繁琐的 null 检查,该类首次出现在 Guava.Java 8 才成为类库中的一部分. 入门 Op ...

  8. Docker踩过的坑

    前言 主要是记录Docker遇到的坑,更多的是因为自己的粗心大意,以此警示 正文 Dockerfile里的RUN 某一次把启动服务的命令写在了 Dockerfile 中,后来发现服务一直拉不起来. 原 ...

  9. 剑指Offer58-左转字符串

    题目 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=" ...

  10. 牛客网NC15二叉树的层次遍历

    题目 给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历) 例如: 给定的二叉树是{3,9,20,#,#,15,7}, 该二叉树层序遍历的结果是 [ [3], [9,20], [1 ...