2654: tree

Time Limit: 30 Sec  Memory Limit: 512 MB
Submit: 2435  Solved: 1011
[Submit][Status][Discuss]

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

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
int V,E,need,f;
struct data {
int u,v,val,c;
}e[];
int fa[];
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
bool cmp(data t,data t1){
return t.c==t1.c?t.val<t1.val:t.c<t1.c;
}
int ans=;
int main() {
scanf("%d%d%d",&V,&E,&need);
for(int i=;i<=E;i++) {
scanf("%d%d%d%d",&e[i].u,&e[i].v,&e[i].val,&e[i].c);
}
sort(e+,e+E+,cmp);
for(int i=;i<=V;i++) fa[i]=i;
int sum=;
for(int i=;i<=E;i++) {
int x=find(e[i].u),y=find(e[i].v);
if(x!=y) {
if(sum>=need){
if(e[i].c==) continue;
sum++;
fa[x]=fa[y];
ans+=e[i].val;
}
else {
ans+=e[i].val;
fa[x]=fa[y];
sum++;
}
}
if(sum==V-) break;
}
printf("%d",ans);
}

最新文章

  1. mono for android学习过程系列教程(2)
  2. IT培训行业揭秘(四)
  3. idea 从github下载项目提示 file name too long 的解决方案
  4. 大熊君大话NodeJS之------FS文件模块
  5. BF算法和KMP算法(javascript版本)
  6. 查看Centos系统信息命令
  7. 基于dojo模板的widget
  8. Heritrix源码分析(十四)
  9. Android与js交互实例
  10. PHP链接Redis
  11. OR1200中指令Cache的结构
  12. 【推荐】桌面版AI伴侣 含2.47 2.49 2.51汉化版
  13. CentOS7配置mailx使用外部smtp服务器发送邮件
  14. RDKIT+postgresql做化合物数据存储与查找
  15. Cs231n课堂内容记录-Lecture2-Part1 图像分类
  16. java StringTokenizer
  17. Codeforces 1137D - Cooperative Game - [交互题+思维题]
  18. 获取oracle 随机数
  19. [转]linux下释放文件内存
  20. notion笔记

热门文章

  1. laravel5.5路由使用name的好处
  2. 程序第一次启动推送跳转,handleOpenURL没法跳转的原因
  3. grunt简记
  4. java日期格式化(util包下转成sql包下)
  5. 课时5:闲聊之Python的数据类型
  6. Android开发实例总结
  7. WinDbg分析dump文件排查bug
  8. 像Excel的表格table
  9. role management
  10. Struts1 Spring2 iBatis2 框架的集成