tree (一本通练习||清华集训互测)

tree

内存限制:512 MiB 时间限制:3000 ms 标准输入输出

题目类型:传统 评测方式:文本比较

题目描述

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

输入格式

第一行V,E,need分别表示点数,边数和需要的白色边数。
接下来E行,每行s,t,c,col表示这边的端点(点从0开始标号),边权,颜色(0白色1黑色)。

输出格式

一行表示所求生成树的边权和。
V<=50000,E<=100000,所有数据边权为[1,100]中的正整数。

样例

样例输入

2 2 1
0 1 1 1
0 1 2 0

样例输出

2

数据范围与提示

原数据出错,现已更新 by liutian,但未重测---2016.6.24

也是一个做法比较玄学的题

二分答案,考虑我们往白边上加值或者减值,那么就会对应的少选白边或者少选黑边

那么如果当前  白边+mid如果kuskal选择白边比need多就继续往上面加值,如果选择白边比need少就往下减值

因为kuskal保证图一定连通,并且代价最小。所以保证了正确性

#include<bits/stdc++.h>
#define ll long long
#define A 10000000
using namespace std;
struct edge{
    ll x,y,z,id;
    ll flag;
}e[A];
ll n,m,need,fa[A],zong,ans,end[A];
inline ll read()
{
    ll f=1,x=0;char c=getchar();
    while(!isdigit(c)){if(c==‘-‘) f=-1;c=getchar();}
    while(isdigit(c)){x=x*10+c-‘0‘;c=getchar();}
    return f*x;
}
ll find(ll x)
{
    if(fa[x]!=x) fa[x]=find(fa[x]);
    return fa[x];
}
void hebing(ll x,ll y)
{
    x=find(x),y=find(y);    if(x!=y) fa[y]=x;
}
bool cmp(edge a,edge b){return (a.z==b.z)?(a.flag<b.flag):(a.z<b.z);}
inline void kuskar(ll mid)
{
    for(ll i=0;i<=n;i++)
        fa[i]=i;
    zong=0,ans=0;
    for(ll i=1;i<=m;i++)
    if(!e[i].flag)
        e[i].z+=mid;
    sort(e+1,e+m+1,cmp);
    for(ll i=1;i<=m;i++)
    {
        if(find(e[i].x)!=find(e[i].y))
        {
            if(!e[i].flag)
                zong++;
            hebing(e[i].x,e[i].y);
            ans+=e[i].z;
        }
    }
    for(ll i=1;i<=m;i++)
        if(!e[i].flag)
            e[i].z-=mid;
}
int main()
{
    ll tot=0;
    n=read(),m=read(),need=read();
    for(ll i=1;i<=m;i++)
        e[i].x=read(),e[i].y=read(),e[i].z=read(),e[i].flag=read();
    ll l=-100,r=100;
    while(l<=r)
    {
        ll mid=(l+r)>>1;
        kuskar(mid);
        if(zong>=need) l=mid+1,tot=ans-need*mid;
        else r=mid-1;
    }
    cout<<tot<<endl;
}

原文地址:https://www.cnblogs.com/znsbc-13/p/11202606.html

时间: 2024-09-30 13:03:47

tree (一本通练习||清华集训互测)的相关文章

AC日记——【清华集训2014】奇数国 uoj 38

#38. [清华集训2014]奇数国 思路: 题目中的number与product不想冲: 即为number与product互素: 所以,求phi(product)即可: 除一个数等同于在模的意义下乘以一个数的逆元: 代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define maxn 100005

uoj 41 【清华集训2014】矩阵变换 婚姻稳定问题

[清华集训2014]矩阵变换 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/41 Description 给出一个 N 行 M 列的矩阵A, 保证满足以下性质: M>N.    矩阵中每个数都是 [0,N] 中的自然数.    每行中, [1,N] 中每个自然数都恰好出现一次.这意味着每行中 0 恰好出现 M−N 次.    每列中,[1,N] 中每个自然数至多出现一次. 现在我们要在每行中选取一个非零数,

清华集训2015 V

#164. [清华集训2015]V http://uoj.ac/problem/164 统计 描述 提交 自定义测试 Picks博士观察完金星凌日后,设计了一个复杂的电阻器.为了简化题目,题目中的常数与现实世界有所不同. 这个电阻器内有编号为 1∼n1∼n 的 nn 个独立水箱,水箱呈圆柱形,底面积为 1 m21 m2,每个水箱在顶部和底部各有一个阀门,可以让水以 1 m3/s 的流量通过,每个水箱的上阀门接水龙头,可以无限供应水,下阀门不接东西,可以让水流出.水箱顶部和底部都有一个接口,水的电

小组互测评论

时间:2014年5月9号 互测小组:本组与刘铸辉(组长)组 第一版本互测初步评论: 杨波:整体界面很好,要实现的基本功能实现了: 崔海营:日程录入模块实现的很好,调用了系统设计: 周亚豪:每周日历表这个模块导入效果不错,整体界面良好: 蔡容玉:日程录入模块实现了,但是好像录入了后在每天时间表的事件中没有及时更新: 闵芮:界面较简便,功能不错:期待后续版本: 张丹丹:软件界面不美观,手机屏幕利用率不高,但总体功能比较完善,对学生有一定的实用性. 高琪:界面清晰,功能明确,但是希望界面更好看:

2017.11.26【清华集训2017】模拟

T1 5483. [清华集训2017模拟11.26]简单路径T2 5484. [清华集训2017模拟11.26]快乐树T3 5485. [清华集训2017模拟11.26]字符串 T1 结论题,结论很显然任意两条路径权异或后,会将两条路径的交的贡献删去.然后用个桶存一下出现过的异或和,暴力判一下就可以了 code 1 #include<cstdio> 2 #include<cmath> 3 #include<cstring> 4 #include<algorithm

【UOJ274】【清华集训2016】温暖会指引我们前行 LCT

[UOJ274][清华集训2016]温暖会指引我们前行 任务描述 虽然小R住的宿舍楼早已来了暖气,但是由于某些原因,宿舍楼中的某些窗户仍然开着(例如厕所的窗户),这就使得宿舍楼中有一些路上的温度还是很低. 小R的宿舍楼中有n个地点和一些路,一条路连接了两个地点,小R可以通过这条路从其中任意一个地点到达另外一个地点.但在刚开始,小R还不熟悉宿舍楼中的任何一条路,所以他会慢慢地发现这些路,他在发现一条路时还会知道这条路的温度和长度.每条路的温度都是互不相同的. 小R需要在宿舍楼中活动,每次他都需要从

[LOJ#2325]「清华集训 2017」小Y和恐怖的奴隶主

[LOJ#2325]「清华集训 2017」小Y和恐怖的奴隶主 试题描述 "A fight? Count me in!" 要打架了,算我一个. "Everyone, get in here!" 所有人,都过来! 小Y是一个喜欢玩游戏的OIer.一天,她正在玩一款游戏,要打一个Boss. 虽然这个Boss有 \(10^{100}\) 点生命值,但它只带了一个随从--一个只有 \(m\) 点生命值的"恐怖的奴隶主". 这个"恐怖的奴隶主&qu

[LOJ#2328]「清华集训 2017」避难所

[LOJ#2328]「清华集训 2017」避难所 试题描述 "B君啊,你当年的伙伴都不在北京了,为什么你还在北京呢?" "大概是因为出了一些事故吧,否则这道题就不叫避难所了." "唔,那你之后会去哪呢?" "去一个没有冬天的地方." 对于一个正整数 \(n\),我们定义他在 \(b\) 进制下,各个位上的数的乘积为 \(p = F(n, b)\). 比如 \(F(3338, 10) = 216\). 考虑这样一个问题,已知 \

[LOJ#2327]「清华集训 2017」福若格斯

[LOJ#2327]「清华集训 2017」福若格斯 试题描述 小d是4xx9小游戏高手. 有一天,小d发现了一个很经典的小游戏:跳青蛙. 游戏在一个 \(5\) 个格子的棋盘上进行.在游戏的一开始,最左边的两个格子上各有一个向右的青蛙,最右边的两个格子上各有一个向左的青蛙. 每次移动可以选取一个青蛙,向这只青蛙的前方移动一格到空格子中或跳过前方的一个不同朝向的青蛙并移动到空格子中. 为了使你更好地理解这个游戏,我们下发了一个游戏demo作为参考(注意:这个demo中的棋盘大小和题目中并不相同).