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,3:V<=15
  0,..,19:V<=50000,E<=100000
  所有数据边权为[1,100]中的正整数。

Source

Solution

  如果给所有白色边加上一个权值,所形成的最小生成树的白边数会随该权值的增大而减小,满足单调性,可以二分权值。

  排序有一个技巧:我们每次考虑最多可以使用多少条白边,所以排序时若权值相同,白边排前黑边排后。如果排序不管黑边白边,那么所求的白边数会小于期望的答案,可能会导致WA。

  当然黑边在前白边在后也行,题是死的人是活的。

 #include <bits/stdc++.h>
using namespace std;
struct edge
{
int u, v, w, col;
bool operator < (const edge &rhs) const
{
return w == rhs.w ? col < rhs.col : w < rhs.w;
}
}e[];
int n, m, fa[], ans; int getfa(int x)
{
return fa[x] = x == fa[x] ? x : getfa(fa[x]);
} int Kruskal(int x)
{
int ecnt = , wcnt = , u, v;
ans = ;
for(int i = ; i <= n; i++)
fa[i] = i;
for(int i = ; i <= m; i++)
if(!e[i].col) e[i].w += x;
sort(e + , e + m + );
for(int i = ; i <= m; i++)
{
u = getfa(e[i].u), v = getfa(e[i].v);
if(u != v)
{
fa[v] = u, ans += e[i].w;
if(!e[i].col) wcnt++;
if(++ecnt >= n) break;
}
}
for(int i = ; i <= m; i++)
if(!e[i].col) e[i].w -= x;
return wcnt;
} int main()
{
int k, l = -, r = , mid;
cin >> n >> m >> k;
for(int i = ; i <= m; i++)
cin >> e[i].u >> e[i].v >> e[i].w >> e[i].col;
for(int i = ; i <= m; i++)
e[i].u++, e[i].v++;
while(l < r - )
{
mid = (l + r) / ;
if(Kruskal(mid) < k) r = mid;
else l = mid;
}
Kruskal(l);
cout << ans - l * k << endl;
return ;
}

最新文章

  1. ASP.NET Core 中文文档 第二章 指南 (09) 使用 Swagger 生成 ASP.NET Web API 在线帮助测试文档
  2. tp5 中 model 的聚合查询
  3. list-style
  4. Ubuntu 14.04 安装 VirtualBox
  5. python抓取汇率
  6. javascript动态创建对象
  7. HDU 3832 Earth Hour(最短路)
  8. 写入与导出excel
  9. Andorid第三方库
  10. 为什么Java 两个Integer 中1000==1000为false而100==100为true?
  11. MySQL学习(三)主备分库分表和恢复数据 --- 2019年2月
  12. 微软Azure通知中心 (Azure Notification Hubs)
  13. 解决ADB server didn&#39;t ACK问题
  14. win 7 下合并多个表格
  15. CodeForces - 369C - Valera and Elections
  16. 编写一个带有main函数的类,调用上面的汽车类,实例化奔驰、大众、丰田等不同品牌和型号,模拟开车过程:启动、加速、转弯、刹车、息火,实时显示速度。
  17. Python练习笔记——对输入的数字进行加和
  18. Github概念理解备忘录
  19. thinkphp5.0 多层MVC
  20. centos 查询mysql配置文件位置

热门文章

  1. python[error] - mysql_config not found
  2. XCode 安装 Alcatraz包管理器失败的处理
  3. sqlsever 科学计数法 转标准值
  4. Yii2 灵活加载js、css
  5. php 网络爬虫2种方法
  6. UVA - 247 Calling Circles Floyd判圈
  7. python高阶函数式编程
  8. Ansible自动化运维笔记3(playbook)
  9. 转 Caffe学习系列(12):训练和测试自己的图片
  10. python函数式编程之装饰器(二)