【BZOJ 2654】 MST

2654: tree

Description

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

题目保证有解。

Input

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

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

Output

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

V<=50000,E<=100000,所有数据边权为[1,100]中的正整数。

Sample Input

2 2 1

0 1 1 1

0 1 2 0

Sample Output

2

HINT

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

Source

【分析】

  嗯?我想不到的题。。如果不断给所有白色边加上同一个值,跑MST(边权相同先选白色边),那么选取的白色边的数量显然是不降的,就这样,最后减掉need*add就好了。

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 #define Maxn 50010
 8 #define Maxm 100010
 9 #define INF 0x7fffffff
10
11 int n,m,k;
12
13 int mymin(int x,int y) {return x<y?x:y;}
14
15 struct node
16 {
17     int x,y,c,cc,p,next;
18 }t[Maxm*2];
19 int first[Maxn],len;
20
21 void ins(int x,int y,int c,int p)
22 {
23     t[++len].x=x;t[len].y=y;t[len].cc=t[len].c=c;t[len].p=p;
24     t[len].next=first[x];first[x]=len;
25 }
26
27 bool cmp(node x,node y)
28 {
29     if(x.c==y.c) return x.p<y.p;
30     return x.c<y.c;
31 }
32
33 int fa[Maxn];
34 int ffa(int x)
35 {
36     if(fa[x]!=x) fa[x]=ffa(fa[x]);
37     return fa[x];
38 }
39
40 int tot,now;
41 void check(int x)
42 {
43     tot=0;now=0;
44     for(int i=1;i<=n;i++) fa[i]=i;
45     for(int i=1;i<=len;i++) if(!t[i].p) t[i].c=t[i].cc+x;
46     sort(t+1,t+1+len,cmp);
47     for(int i=1;i<=len;i++)
48     {
49         int x=t[i].x,y=t[i].y;
50         if(ffa(x)!=ffa(y))
51         {
52             fa[ffa(x)]=ffa(y);
53             if(!t[i].p) tot++;
54             now+=t[i].c;
55         }
56     }
57 }
58
59 int ffind(int l,int r)
60 {
61     int ans=INF;
62     while(l<=r)
63     {
64         int mid=(l+r)>>1;check(mid);
65         if(tot>=k) ans=now-k*mid,l=mid+1;
66         else r=mid-1;
67     }
68     return ans;
69 }
70
71 int main()
72 {
73     scanf("%d%d%d",&n,&m,&k);
74     len=0;
75     memset(first,0,sizeof(first));
76     int cnt=0;
77     for(int i=1;i<=m;i++)
78     {
79         int x,y,c,p;
80         scanf("%d%d%d%d",&x,&y,&c,&p);
81         x++;y++;
82         if(p==0) cnt++;
83         ins(x,y,c,p);ins(y,x,c,p);
84     }
85     int ans=ffind(-100,100);
86     if(ans==INF) ans=0;
87     printf("%d\n",ans);
88     return 0;
89 }

2017-03-08 21:26:50

时间: 2024-10-13 12:41:48

【BZOJ 2654】 MST的相关文章

【BZOJ 2654】tree

Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色边数. 接下来E行 每行s,t,c,col表示这边的端点(点从0开始标号),边权,颜色(0白色1黑色). Output 一行表示所求生成树的边权和. Sample Input 2 2 1 0 1 1 1 0 1 2 0 Sample Output 2 HINT 数据规模和约定 0:V<=10 1,2

【BZOJ 2820】 YY的GCD

2820: YY的GCD Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 807  Solved: 404 [Submit][Status] Description 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对 kAc这种傻×必然不会了,于是向你来请教-- 多组输入 Input 第一行一个整数T 表述数据组数 接下来T行,每行两个正整数,表示

【BZOJ 1854】 [Scoi2010]游戏

1854: [Scoi2010]游戏 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 2609  Solved: 931 [Submit][Status] Description lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某一个属性.并且每种装备最多只能使用一次. 游戏进行到最后,lxhgww遇到了终极boss,这个终极bos

【BZOJ 1036】【ZJOI 2008】树的统计

此题为树链剖分的裸题. 代码如下,使用常用的轻重链剖分. /************************************************************** Problem: 1036 User: Evensgn Language: C++ Result: Accepted Time:2468 ms Memory:5772 kb ****************************************************************/ #inc

【BZOJ 1150】 1150: [CTSC2007]数据备份Backup (贪心+优先队列)

1150: [CTSC2007]数据备份Backup Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的乐趣.已知办公 楼都位于同一条街上.你决定给这些办公楼配对(两个一组).每一对办公楼可以通过在这两个建筑物之间铺设网 络电缆使得它们可以互相备份.然而,网络电缆的费用很高.当地电信公司仅能为你提供 K 条网络电缆,这意味 着你仅

【BZOJ 2823】 [AHOI2012]信号塔

2823: [AHOI2012]信号塔 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 469  Solved: 198 [Submit][Status][Discuss] Description 在野外训练中,为了确保每位参加集训的成员安全,实时的掌握和收集周边环境和队员信息非常重要,集训队采用的方式是在训练所在地散布N个小型传感器来收集并传递信息,这些传感器只与设在集训地中的信号塔进行通信,信号塔接收信号的覆盖范围是圆形,可以接收到所有分布在

【BZOJ 3190】 [JLOI2013]赛车

3190: [JLOI2013]赛车 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 803 Solved: 279 [Submit][Status][Discuss] Description 这里有一辆赛车比赛正在进行,赛场上一共有N辆车,分别称为个g1,g2--gn.赛道是一条无限长的直线.最初,gi位于距离起跑线前进ki的位置.比赛开始后,车辆gi将会以vi单位每秒的恒定速度行驶.在这个比赛过程中,如果一辆赛车曾经处于领跑位置的话(即没有其他

【BZOJ 2115】 [Wc2011] Xor

2115: [Wc2011] Xor Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 962  Solved: 441 [Submit][Status] Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 Di的无向边. 图中可能有重边或自环. Output 仅包含一个整数,表示最大的XOR和(十进

【BZOJ 1146】 [CTSC2008]网络管理Network

1146: [CTSC2008]网络管理Network Time Limit: 50 Sec  Memory Limit: 162 MB Submit: 1938  Solved: 577 [Submit][Status] Description M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条高速光缆组成.每个部门都有一个专属的路由器,部门局域网内的所有机