题目大意如下:
有N个房间,通过N-1个门相连(每个房间的门数在1到3之间),现在有M个路由器,需要把M个路由器放置在其中一些房间中,使得放置路由和其周围的房间能收到wifi信号(假如一个房间放置了路由器,只有它自己以及与它相邻的房间可以收到它的信号)。每个房间都有一个满意度,如果 该房间可以收到WiFi信号则,总的满意度就会累加上该房间的满意度。现在问,怎样放置M个路由器使得总满意度最大。
输入:
第一行两个整数N M,代表N个房间M个路由器,(2<=N<=1000, 1<=M<=N, M<=100)
第二行N个数,代表每个房间满意度
接下来N-1行,表示N-1个门,其中每行两个整数,代表门联通的房间号
输出:
最大满意度
样例输入:
5 1
1 2 3 4 5
2 1
3 2
4 2
5 3
7 1
1 2 3 4 5 6 7
2 1
3 2
4 2
5 3
6 2
7 4
7 2
1 2 3 4 5 6 7
2 1
3 2
4 2
5 3
6 2
7 4
8 2
1 2 3 4 5 6 7 8
2 1
3 2
4 2
5 3
6 2
7 4
8 5
样例输出:
16
23
29
分析:首先将题目抽象成N个节点的树,房间为节点,门为边,节点的权值为满意度,接下来从中选择M节点,让它覆盖的权最大。
从N个点中选M个点,有C(N,M)种,可以从两个方面考虑
1.考虑树中的非叶子结点num,分两种情况:
如果num<=M,直接选取非叶子结点放置,如果有剩余则再随便放在叶节点,这样能满足所有房间全覆盖;满意度为所有房间之和。
如果num>M,这种情况比较复杂,我也没分析明白
2.直接用遗传算法解决,每个房间有一个编号,从中选择M个房间。对于基因的编码有两种考虑,这两种方法导致的复杂度相差很大。
(1)染色体长度为M,每一个基因分别代表选中的房间号,整个编码长度较短,交叉复杂度较低。例如:N&#