[国家集训队2012]tree(陈立杰)
来源:互联网 发布:js模拟按键 编辑:程序博客网 时间:2024/05/22 03:49
1764. [国家集训队2012]tree(陈立杰)
★★★ 输入文件:nt2012_tree.in
输出文件:nt2012_tree.out
简单对比时间限制:3 s 内存限制:1024 MB
【大意】
给你一个无向带权连通图,每条边是黑色或白色。让你求一棵最小权的恰好有need条白色边的生成树。题目保证有解。
【输入格式】
接下来E行
每行s,t,c,col表示这边的端点(点从0开始标号),边权,颜色(0白色1黑色)。
【输出格式】
【数据规模和约定】
1,2,3:V<=15
0,..,19:V<=50000,E<=100000
所有数据边权为[1,100]中的正整数。
【样例输入】
0 1 1 1
0 1 2 0
【样例输出】
二分+
如果直接
证明:
我们发现,如果我们给白边增加权值,做最小生成树,由于白边权值增大,导致不容易选白边。记
其次,我们发现,由于黑边的权值是不变的,与白边权值不相互影响。同样由于白边之间关系相对不变,必然选出的
其实是傻逼题
考虑二分一个值,给白边边权加上这个值,然后不论颜色MST,记录白边数量
一定有一个值满足MST中白边数量恰好为k
二分姿势不对一直WA(╯‵□′)╯︵┻━┻
可以发现如果分别给白边加-101~101,形成的“合法白边数”区间加起来一定不会漏,因为给白边加x的最少白边数,和给白边加x+1的最多白边数其实是一个意思(二者在Kruskal时加边顺序相同)
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<queue>
#include<set>
#include<map>
#include<deque>
#include<cstdlib>
#include<algorithm>
#define V 505000
#define mod 1000000007
#define LL long long
using namespace std;
int f[V];
struct sdd
{
int x,y,dis,xx;
friend bool operator < (sdd x,sdd y)
{
if(x.dis==y.dis)return x.xx<y.xx;
return x.dis<y.dis;
}
}ww[V];
int head[V],tot,m,n,md,k,sb,dd,ans;
inline int find(int x)
{
if(f[x]!=x)f[x]=find(f[x]);
return f[x];
}
inline void sbd()
{
int k=0;
int xx,yy;
md=0;sb=0;
sort(ww+1,ww+m+1);
for(int i=1;i<=n;i++)
f[i]=i;
for(int i=1;i<=m;i++)
{
xx=find(ww[i].x);
yy=find(ww[i].y);
if(xx!=yy)
{
f[yy]=xx;
sb+=ww[i].dis;
md+=!(ww[i].xx);
k++;
}
if(k==n-1)break;
}
}
int main()
{
//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);
freopen("nt2012_tree.in","r",stdin);freopen("nt2012_tree.out","w",stdout);
memset(head,-1,sizeof(head));
int xx,yy;
cin>>n>>m>>dd;
int sz=m;
while(m--)
{
cin>>ww[m+1].x>>ww[m+1].y>>ww[m+1].dis>>ww[m+1].xx;
ww[m+1].x++;ww[m+1].y++;
}
m=sz;
int l=-101,r=101,mid;
while(l<=r)
{
mid=(l+r)/2;
for(int i=1;i<=m;i++) ww[i].dis+=ww[i].xx?0:mid;
sbd();
if(md>=dd)l=mid+1,ans=sb-dd*mid;
else r=mid-1;
for(int i=1;i<=m;i++)ww[i].dis-=ww[i].xx?0:mid;
}
cout<<ans;
return 0;
}
- [国家集训队2012]tree(陈立杰)
- [国家集训队2012]tree(伍一鸣)
- 【国家集训队2012】【BZOJ2654】tree
- 【国家集训队2012】tree(伍一鸣)
- 2012中国国家集训队命题答辩tree(伍一鸣)
- [国家集训队2012]Tree 最小生成树+二分
- 【国家集训队2012】【BZOJ2738】矩阵乘法
- 【国家集训队2012】【BZOJ2568】比特集合
- 国家集训队论文分类
- 国家集训队论文集 ACM
- 国家集训队论文集题目
- 国家集训队论文分类
- 国家集训队论文分类
- NOI 国家集训队论文集
- 国家集训队论文分类
- 国家集训队论文分类
- NOI 国家集训队论文集
- NOI 国家集训队论文集
- 插入排序法
- 二十三种设计模式之生成器模式
- 二叉搜索建树及相应的函数
- 【RabbitMQ】——整合spring
- RCNN学习笔记(4):fast rcnn
- [国家集训队2012]tree(陈立杰)
- 归并排序
- html其他标签
- leetcode 28 Implement strStr()
- Java面试题--解释Java中的异常处理流程
- 【设计模式】访问者模式
- Centos6.x Samba的部署与案例
- bootstrap创建登录注册页面
- 后序中序求层序