2018"百度之星"程序设计大赛 - 资格赛hdu6349三原色(最小生成树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6349
题目:
三原色图
Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 555 Accepted Submission(s): 186
个点 m
条边的无向图,所有点按照 1,2,⋯,n
标号,每条边有一个正整数权值以及一种色光三原色红、绿、蓝之一的颜色。
现在度度熊想选出恰好 k
条边,满足只用这 k
条边之中的红色边和绿色边就能使 n
个点之间两两连通,或者只用这 k
条边之中的蓝色边和绿色边就能使 n
个点之间两两连通,这里两个点连通是指从一个点出发沿着边可以走到另一个点。
对于每个 k=1,2,⋯,m
,你都需要帮度度熊计算选出恰好 k
条满足条件的边的权值之和的最小值。
,表示有 T
组测试数据。
接下来依次描述 T
组测试数据。对于每组测试数据:
第一行包含两个整数 n
和 m
,表示图的点数和边数。
接下来 m
行,每行包含三个整数 a,b,w
和一个字符 c
,表示有一条连接点 a
与点 b
的权值为 w
、颜色为 c
的无向边。
保证 1≤T≤100
,1≤n,m≤100
,1≤a,b≤n
,1≤w≤1000
,c∈{R,G,B}
,这里 R,G,B
分别表示红色、绿色和蓝色。
组测试数据,接下来 m
行,每行包含一个整数,第 i
行的整数表示选出恰好 i
条满足条件的边的权值之和的最小值,如果不存在合法方案,输出 −1
,行末不要有多余空格。
5 8
1 5 1 R
2 1 2 R
5 4 5 R
4 5 3 G
1 3 3 G
4 3 5 G
5 4 1 B
1 2 2 B
-1
-1
-1
9
10
12
17
22
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define maxn 105
#define inf 0x3f3f3f3f
priority_queue<int,vector<int>,greater<int> >que;
int n,m,par[maxn],rk[maxn],ans[maxn];
struct node{
int u,v,w,c;
bool operator<(const node &a)const
{ //按边的权值从小到大排
return w<a.w;
}
}edge[maxn]; //边数组
void init()
{ //初始化
for(int i=;i<=n;i++)
{
par[i]=i;
rk[i]=;
}
}
int find(int x)
{ //查找节点x所在树的根节点
if(x==par[x])
return x;
else //路径压缩
return par[x]=find(par[x]);
}
void unite(int x,int y)
{ //将两个不同集合的节点合并,两个集合变一个
int fx=find(x),fy=find(y);
if(rk[fx]<rk[fy])
par[fx]=fy;
else
{
par[fy]=fx;
if(rk[fx]==rk[fy])
rk[fx]++;
}
}
void kruskal(int c)
{
int cnt=,sum=; //cnt已选边的数目,sum为当前边权值之和
init();
while(!que.empty())
que.pop();
for(int i=;i<m;i++)
{
int u=edge[i].u,v=edge[i].v,col=edge[i].c;
if(find(u)!=find(v)&&col!=c&&cnt<=n-)
{
sum+=edge[i].w;
cnt++;
unite(u,v);
if(cnt==n-)
{
if(ans[cnt]==-) ans[cnt]=sum;
else ans[cnt]=min(ans[cnt],sum);
}
}
else //将未选中的边加入优先队列
que.push(edge[i].w);
}
if(cnt<n-) return;
while(!que.empty())
{
sum+=que.top();
que.pop();
++cnt;
if(ans[cnt]==-) ans[cnt]=sum;
else ans[cnt]=min(ans[cnt],sum);
}
}
int main()
{
int T;
scanf("%d",&T);
int kase=;
while(T--)
{
scanf("%d%d",&n,&m);
char c;
for(int i=;i<m;i++)
{
scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);
getchar();
c=getchar();
if(c=='B') edge[i].c=;
else if(c=='R') edge[i].c=;
else edge[i].c=;
}
memset(ans,-,sizeof(ans));
sort(edge,edge+m);
kruskal(); //第一种方案颜色不可为蓝色
kruskal(); //第二种方案颜色不可为红色
printf("Case #%d:\n",++kase);
for(int i=;i<=m;i++)
printf("%d\n",ans[i]);
}
}
2018"百度之星"程序设计大赛 - 资格赛hdu6349三原色(最小生成树)的更多相关文章
- 2018"百度之星"程序设计大赛 - 资格赛 - 题集
1001 $ 1 \leq m \leq 10 $ 像是状压的复杂度. 于是我们(用二进制)枚举留下的问题集合 然后把这个集合和问卷们的答案集合 $ & $ 一下 就可以只留下被选中的问题的答 ...
- 2018"百度之星"程序设计大赛 - 资格赛 A/B/E/F
调查问卷 Accepts: 505 Submissions: 2436 Time Limit: 6500/6000 MS (Java/Others) Memory Limit: 262144/ ...
- 2018"百度之星"程序设计大赛 - 资格赛 1002 子串查询
题面又是万能的毒毒熊... 实在不想写了,就只写了这题 记26个前缀和查询枚举最小值直接算 实在是氵的死 而且我忘记输出Case #%d 想了很久 >_< #include<bits ...
- 子串查询(二维前缀数组) 2018"百度之星"程序设计大赛 - 资格赛
子串查询 Time Limit: 3500/3000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Subm ...
- 2018"百度之星"程序设计大赛 - 资格赛
调查问卷 Accepts: 1546 Submissions: 6596 Time Limit: 6500/6000 MS (Java/Others) Memory Limit: 262144 ...
- HDU6383 2018 “百度之星”程序设计大赛 - 初赛(B) 1004-p1m2 (二分)
原题地址 p1m2 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total ...
- HDU6380 2018 “百度之星”程序设计大赛 - 初赛(B) A-degree (无环图=树)
原题地址 degree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tot ...
- hdu 6082 度度熊与邪恶大魔王(2017"百度之星"程序设计大赛 - 资格赛 )
度度熊与邪恶大魔王 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- 2014年百度之星程序设计大赛 - 资格赛 第二题 Disk Schedule
双调欧几里得旅行商问题是一个经典动态规划问题.<算法导论(第二版)>思考题15-1和北京大学OJ2677都出现了这个题目. 旅行商问题描写叙述:平面上n个点,确定一条连接各点的最短闭合旅程 ...
随机推荐
- Oracle Flashback 详解
Oracle flashback 是一种方便快捷的数据库恢复技术,它不使用备份文件,通过闪回日志可以使数据库恢复到过去的某个状态,当用户发生逻辑错误时(误删表数据.表.表空间等)需要快速恢复数据库,可 ...
- [转帖]HPE的软件部分到底是谁的?
英国Micro Focus公司收购惠普旗下软件部门 http://www.gongkong.com/news/201710/369740.html 搞不清楚 现在ALM 到底是谁的资产了.. 据国外媒 ...
- 你不知道的JavaScript——第一章:作用域是什么?
编译原理 JavaScript事实上是一门编译语言,但与传统的编译语言不同,它不是提前编译的,编译结果也不能在分布式系统中进行移植. 任何JavaScript代码片段在执行前都要进行编译(通常就在执行 ...
- JDK 环境变量的设置、eclipse、Tomcat的配置
一.JDK的环境变量的设置 环境变量设置: JDK下载好后,(1)选择电脑属性-高级系统设置-高级-环境变量,接着在系统变量中(2)新建JAVA_HOME,变量值设置为下载好后JDK在电脑中的路径;( ...
- python之路--MySQL多表查询
一 介绍 我们在写项目的时候一般都会建一个数据库,数据库里面会存很多的表,不可能把所有的数据都放在一张表里,因为分表来存数据节省空间,数据的组织结构更清晰,解耦和程度更高,但是这些表本质上还不是一个整 ...
- vue实例相关2
vue data中 对象/数组 不为空,即使定义为[]/{} new Vue({ el: '#main', data: { list: [], current: {}, aa:'' } }) cons ...
- XCTF 4th-WHCTF-2017 creakme
exe文件 运行一下 随便输一下 ps.这个曹操身边的故事挺有意思的 但是没啥卵用....... 查一下壳无壳 ida载入 发现找不到main函数 直接看start感觉逻辑乱乱的(萌新求不喷..... ...
- MyISAM索引和InnoDB索引的区别
首先你要知道: 无论是Myisam和Innodb引擎,如果在建表的时候没有显示的定义一行主键列的话,他内部都会自动创建一个隐藏的主键索引: 主键索引以外的索引假设称为次索引:首先Myisam和Inno ...
- NPOI 上传Excel功能
1.首先写一个Excel表格,第一行数据库类型(varchar.date.decimal).第二行数据库类型长度(100.12,4.时间日期为空)2.html 加按钮 { type: "bu ...
- How to enable flash on Chromium
sudo apt install chromium-browser pepperflashplugin-nonfree