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个点,确定一条连接各点的最短闭合旅程 ...
随机推荐
- myecplise ssh项目配置上遇到的问题
版本:spring3.1+hib4.1+struts2.1 学习项目使用此版本运行时,总是会遇到各样的错误,在这里做一下记录. 问题1:log4j相关 spring的web项目,执行时报错: 信息: ...
- Mac上通过iterm 上传文件到服务器
.安装 brew install lrzsz #这里以homebrew方式安装12.脚本 拉取 https://github.com/mmastrac/iterm2-zmodem 两个sh文件,将他们 ...
- 7 Make vs Do
1 英语中,含有 "do" 和 "make" 的词语, 例如 "make a suggestion" 和 "do your bes ...
- Redis 安装学习
Linux下下载安装redis https://redis.io/download tar -zvxf redisxxx cd redisxxxx make ---进行安装 vim ~.bash_p ...
- easyUI 数据表格datagrid的使用
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- WebService实例-CRM系统提供WebService实现用户注册功能
<—start—> 编写crm的webservice接口,实现客户信息保存操作.在CustomerService接口中新增一个服务接口,用于添加客户注册的信息. @Path("/ ...
- java学习之—链表(1)
/** * 单链表操作 * Create by Administrator * 2018/6/14 0014 * 下午 2:05 **/ public class Link { public int ...
- James 3.1服务器的安装与搭建
参考:1. ububtu下基于docker安装配置Apache James 3.1.0: https://blog.csdn.net/bonwei/article/details/83061372 2 ...
- nfs+keepalived高可用
1台nfs主被服务器都下载nfs.keepalived yum install nfs-utils rpcbind keepalived -y 2台nfs服务器nfs挂载目录及配置必须相同 3.在主n ...
- java float double bigdecimal
java 有 float,double,BigDecimal 三种,前两者会损失精度,最后一个是专门用于高精度计算的大数类型,但是会损失性能.如果用于金融场合且小数位并不多的时候,可以考虑 BigDe ...