题干:

度度熊有一张 nn 个点 mm 条边的无向图,所有点按照 1,2,⋯,n1,2,⋯,n 标号,每条边有一个正整数权值以及一种色光三原色红、绿、蓝之一的颜色。

现在度度熊想选出恰好 kk 条边,满足只用这 k 条边之中的红色边和绿色边就能使 n 个点之间两两连通,或者只用这 kk 条边之中的蓝色边和绿色边就能使 nn 个点之间两两连通,这里两个点连通是指从一个点出发沿着边可以走到另一个点。

对于每个 k=1,2,⋯,mk=1,2,⋯,m,你都需要帮度度熊计算选出恰好 kk 条满足条件的边的权值之和的最小值。

Input

第一行包含一个正整数 TT,表示有 TT 组测试数据。

接下来依次描述 TT 组测试数据。对于每组测试数据:

第一行包含两个整数 nn 和 mm,表示图的点数和边数。

接下来 mm 行,每行包含三个整数 a,b,wa,b,w 和一个字符 cc,表示有一条连接点 aa 与点 bb 的权值为 ww、颜色为 cc 的无向边。

保证 1≤T≤1001≤T≤100,1≤n,m≤1001≤n,m≤100,1≤a,b≤n1≤a,b≤n,1≤w≤10001≤w≤1000,c∈{R,G,B}c∈{R,G,B},这里 R,G,BR,G,B 分别表示红色、绿色和蓝色。

Output

对于每组测试数据,先输出一行信息 "Case #x:"(不含引号),其中 x 表示这是第 xx 组测试数据,接下来 mm 行,每行包含一个整数,第 ii 行的整数表示选出恰好 ii 条满足条件的边的权值之和的最小值,如果不存在合法方案,输出 −1−1,行末不要有多余空格。

Sample Input

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

Sample Output

Case #1:
-1
-1
-1
9
10
12
17
22

解题报告:

刚开始读错题了很尴尬、、题面说的是 用k条红色边绿色边 或者 用k条蓝色边绿色边,我理解成了并且,也就是这k条边必须仅用红绿可以构成生成树,并且仅用蓝绿也可以构成生成树了、、、如果是那样的话就比较难考虑了。。不过这个题还好,直接用红绿求一个,用蓝绿求一个,这样分成两个独立的问题。对于每个问题,先构成MST,然后直接贪心加边就行了。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define F first
#define S second
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
typedef pair<int,int> PII;
const int MAX = 2e5 + 5;
const int INF = 0x3f3f3f3f;
int n,m,flag[MAX],f[MAX],ans[MAX];
struct Edge {int u,v,w;int col;//0绿 1红 2蓝Edge(int u=0,int v=0,int w=0,int col=0):u(u),v(v),w(w),col(col) {}friend bool operator < (Edge a,Edge b) {return a.w < b.w;}
} e[MAX];
int getf(int v) {return f[v] == v ? v : f[v] = getf(f[v]);
}
void init() {for(int i = 1; i<=n; i++) f[i] = i;for(int i = 1; i<=m; i++) flag[i] = 0;
}
void Klu(int col) {init();int res = 0,cnt = 0;for(int u,v,i = 1; i<=m; i++) {u = getf(e[i].u); v = getf(e[i].v);if(u == v || e[i].col == col) continue;f[v] = u;cnt++;res += e[i].w;flag[i] = 1;}if(cnt < n-1) return;int top = n-1;ans[top] = min(ans[top],res);for(int i = 1; i<=m; i++) {if(flag[i] == 1) continue;res += e[i].w;top++;ans[top] = min(ans[top],res);}
}
int main() {int t,iCase=0;char s[5];cin>>t;while(t--) {scanf("%d%d",&n,&m);for(int i = 1; i<=m; i++) ans[i] = INF;for(int a,b,c,i = 1; i<=m; i++) {scanf("%d%d%d%s",&a,&b,&c,s);e[i] = Edge(a,b,c,0);if(s[0] == 'R') e[i].col = 1;if(s[0] == 'B') e[i].col = 2;}sort(e+1,e+m+1);Klu(1);Klu(2); printf("Case #%d:\n",++iCase);for(int i = 1; i<=m; i++) {if(ans[i] == INF) puts("-1");else printf("%d\n",ans[i]);}}return 0 ;
}/*
1
3 6
1 2 100 G
2 3 100 G
1 2 1 B
2 3 10 B
1 2 2 R
2 3 20 R
Case #1:
-1
11
13
33
133
233
*/

读错题太可怕了,直接由一个水题变成一个不可做题、、

【HDU - 6349】三原色图(最小生成树,思维,tricks)相关推荐

  1. 【HDU - 3394】Railway(点双连通分量,Tarjan算法,思维tricks)

    题干: There are some locations in a park, and some of them are connected by roads. The park manger nee ...

  2. hdu 1301 Jungle Roads 最小生成树

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1301 The Head Elder of the tropical island of Lagrish ...

  3. hdu 5483 Nux Walpurgis(最小生成树+dfs)

    题目链接:hdu 5483 Nux Walpurgis 解题思路 先求一下最小生成树.然后枚举起点,遍历整棵树,维护树边能被替换的最小权值. 代码 #pragma comment(linker, &q ...

  4. HDU 6092 Rikka with Subset 思维 递推

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6092 题目描述: 给你一个集合的所有子集各个和, 让你找到这个集合, 输出字典序最小 解题思路: 下 ...

  5. HDU 1863 畅通工程 最小生成树

    思路: 比较典型的最小生成树的题目了..在这里用求最小生成树的经典算法K(Kruskal)算法和P(Prim)算法.我的 K 算法用的是结构体来存图,P 算法用的是邻接矩阵来存图,K算法的复杂度是O( ...

  6. 2021牛客暑期多校训练营3 B Black and white 最小生成树 + 思维

    传送门 文章目录 题意: 思路: 题意: 思路: 对于每个数的位置(i,j)(i,j)(i,j),如果将这个位置染黑,那么我们连一个i−>j+ni->j+ni−>j+n的边,可以发现 ...

  7. hdu 4747 mex 线段树+思维

    http://acm.hdu.edu.cn/showproblem.php?pid=4747 题意: 我们定义mex(l,r)表示一个序列a[l]....a[r]中没有出现过得最小的非负整数, 然后我 ...

  8. hdu 1232 畅通工程 最小生成树 并查集

    1232的连接:http://acm.hdu.edu.cn/showproblem.php?pid=1232 #include <iostream>#include <cstdio& ...

  9. HDU 6090 Rikka with Graph 思维 公式

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6090 题目描述: 有n个点, 你可以连m条边, 使得∑ni=1∑nj=1dist(i,j).最小, ...

最新文章

  1. 自学Java-运算符
  2. docker run指定entrypiont
  3. 一看就懂系列之 如何实现与控制php常驻进程
  4. 驱动精灵2007_畅玩Steam的Win10游戏掌机发布! |莱莎2新战斗动画,肉腿致命驱动~...
  5. 【动态规划】简单背包问题II
  6. JS函数表达的几种写法
  7. Tomcat设置cmd窗口的title属性
  8. 用srand时间数种子来生成随机数
  9. 机器学习基石--学习笔记02--Hard Dual SVM
  10. 获取arraylist的长度_啃碎JDK源码(三):ArrayList
  11. java虚拟机内存不足,“Could not create the Java Virtual Machine”问题解决方案
  12. 前端页面缓存系列之localStorage
  13. 无心剑中译奥登《用情更深者》
  14. conda deactivate python3_无法访问conda环境中的activate、deactivate或conda
  15. Unity 六边形地图系列(一) 【笔记】: 创建一个六边形网格
  16. app显示服务器图片不显示,如何将存在本地服务器的图片,在APP前台显示
  17. linux网卡桥接模式无法上网
  18. Win11下Clion+MSYS2(MinGW64)配置C++编译环境
  19. 【实习之路】爱奇艺、追一科技日常实习生面试经历分享——爱奇艺篇
  20. 国内外php商城系统 开源、php商城比较。

热门文章

  1. 【数据结构与算法】【算法思想】 A *搜索算法
  2. [剑指offer][JAVA]面试题第[07]题[重建二叉树][递归]
  3. html5同心圆代码,HTML5/Canvas 鼠标跟随的同心圆
  4. C. Number of Pairs
  5. linux apache24 使用,科学网—linux_centos第24_2次课Apache的安装 - 郭会强的博文
  6. android 对话框 图片,android – AlertDialog按钮的图像
  7. php左侧菜单栏递归代码,js实现左侧菜单栏递归循环遍历
  8. linux更改cxxflags环境变量,在64位的ubuntu 14.04 上开展32位Qt 程序开发环境配置(pro文件中增加 QMAKE_CXXFLAGS += -m32 命令)...
  9. nano-pc-t1 4412 显示驱动分析
  10. mysql allowmultiqueries=true_Mysql批量更新的一个坑-allowMultiQueries=true允许批量更新(转)...