题目大意:有n个节点m个通信渠道,每个渠道都需要一定费用,有些渠道必须选用,现在要n个节点能够互相通信,最小费用是多少?
题目描述
Tyvj已经一岁了,网站也由最初的几个用户增加到了上万个用户,随着Tyvi网站的逐步壮大,管理员的数目也越来越多,现在你身为Tyvj管理层的联络员,希望你找到一些通信渠道,使得管理员两两都可以联络(直接或者间接都可以)。Tyvj是一个公益性的网站,没有过多利润,所以你要尽可能地使费用少才可以。
目前你已经知道,Tyvi的通信渠道分为两大类,一类是必选通信渠道,无论价格多少,你都需要把所有的都选择上;还有一类是选择性的通信渠道,你可以从中挑选一些作为最终管理员联络的通信渠道。数据保证给出的通行渠道可以让所有的管理员连通。
输入
第1行:n、m表示Tyvi一共有n个管理员,有m个通信渠道。(n<=2000,m<=10000)
第2行到m+1行:每行四个非负整数p,u,v,w,当p=1时,表示这个通信渠道为必选通信渠道;;当p=2时,表示这个通信渠道为选择性通信渠道;u,v,w表示本条信息描述的是u、v管理员之间的通信渠道,u可以收到v的信息,v也可以收到u的信息,w表示费用。
输出
最小的通信费用。
样例输入
5 6
1 1 2 1
1 2 3 1
1 3 4 1
1 4 1 1
2 2 5 10
2 2 5 5
样例输出
9
解题思路
在必须选某些边的情况下求最小生成树。可以使用克鲁斯卡尔算法,对边进行排序:p=1的边排在p=2的边的前面,p相同的按照费用w来排。排好序后,一条一条边选,如果p=1,必选这条边,选完后累加费用,并把两个节点合并在一起;p=1的选完后,选p=2的边,p=2的边不是必选的,只有两个节点还没合并才需要选。