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个点,确定一条连接各点的最短闭合旅程 ...
随机推荐
- 【翻译】FluentValidation验证组件的使用
由于本文是翻译,所以将原文原原本本的搬上来,大家看原文有什么不懂的也可以对照这里. 给出地址:https://fluentvalidation.net/ FluentValidation fluent ...
- 转:MD5(Message-Digest Algorithm 一种哈希算法)
什么是MD5算法 MD5讯息摘要演算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码杂凑函数,可以产生出一个128位元(16位元组)的散列值(hash val ...
- java日志框架之logback(一)——logback工程简介
Logback工程 致力于成为log4j工程的继承者 Logback的架构足够泛型化,故能够应用于许多不同的环境.当前,logback划分为三个组件: logback-core logback-cla ...
- drf 之序列化组件
序列化 把Python中对象转换为json格式字符串 反序列化 把json格式转为为Python对象. 用orm查回来的数据都是都是一个一个的对象, 但是前端要的是json格式字符串. 序列化两大功能 ...
- sublime text3安装代码格式化的步骤
1.首先查看有没有安装package control插件,若没有,进行此链接操作——http://blog.csdn.net/kongguyoulan523/article/details/51144 ...
- Python2基础
1.python 3.python函数 python的函数定义: 以def关键字定义一个函数: 参数放在小括号里面: 必须有return语句: 关键字参数: 即调用函数时传参顺序可以人为指定 默认参数 ...
- query中对应的OnSetText和onGetText事件
今天在看代码的时候遇到一个问题,query中的某个字段和在表中显示的不是一个值,我觉得很奇怪,于是找了很久,才知道为什么,原来是query中的OnSetText和onGetText事件在作怪,经过一番 ...
- vscode git设置
vscode只能打开一下界面: 在setting.path增加git.path选项,再使用linux的方法配置路径,就是使用D:/../bin/git.exe而不是\\ 重启vscode,git设置即 ...
- Redis 禁用FLUSHALL FLUSHDB KEYS 命令
(error) ERR unknown command 'keys'问题解决(error) ERR unknown command 'FLUSHDB' 问题解决 背景 FLUSHALL FLUSH ...
- 为什么int型最大的数是2147483647
32位的电脑中,用二进制表示,最大的就是32个1,用十进制表示为2^32-1,大概40多亿(4294967295) 对于有符号的,第一位用作表示正负(0,1),最大的就是31个1,用十进制表示为2^3 ...