传送门 HDU6349
描述
度度熊有一张 n 个点 m 条边的无向图,所有点按照 1,2,⋯,n 标号,每条边有一个正整数权值以及一种色光三原色红、绿、蓝之一的颜色。
现在度度熊想选出恰好 k 条边,满足只用这 k 条边之中的红色边和绿色边就能使 n 个点之间两两连通,或者只用这 k 条边之中的蓝色边和绿色边就能使 n 个点之间两两连通,这里两个点连通是指从一个点出发沿着边可以走到另一个点。
对于每个 k=1,2,⋯,m,你都需要帮度度熊计算选出恰好 k 条满足条件的边的权值之和的最小值。
输入
第一行包含一个正整数 T,表示有 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 分别表示红色、绿色和蓝色。
输出
对于每组测试数据,先输出一行信息 “Case #x:”(不含引号),其中 x 表示这是第 x 组测试数据,接下来 m 行,每行包含一个整数,第 i 行的整数表示选出恰好 i 条满足条件的边的权值之和的最小值,如果不存在合法方案,输出 −1,行末不要有多余空格。
样例
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 Boutput
Case #1:
-1
-1
-1
9
10
12
17
22
题解
按两种选取颜色的方法建立两个最小生成树,然后每次分别加上剩下的边中最小的那一条,用两个数组分别保存采用两种方法得出的答案,最后比较两个数组中每个元素的大小,输出小的值
Code
1 |
|
附加彩蛋
这是百度之星资格赛中的一道题,虽然很简单,但是因为一个不起眼的越界问题,导致其他的变量被无意中修改而wa了无数发,真是菜。。。
当然,这一次也是很赚的,那就是我在看其他大佬的代码时发现了一些骚气的写法
比如:
1
2
3
4
5
6
7 struct cun{
int a;int b;int dis;char color;
bool operator < (cun e){return dis<e.dis;}
void read(){scanf("%d %d %d %c",&a,&b,&dis,&color);}
}bian[1005];
sort(bian,bian+m);
for(int i=0;i<m;i++)bian[i].read();
也就是结构体中的运算符重载(再写cmp我是狗/kb)和函数用法,以及通过结构体的构造函数赋值的方法
不得不说,这一波之后,虽然我没有变强,但是…我变骚了许多hhhhhhh