我目前正试图解决去年波兰大学锦标赛的算法问题,内容如下:
Bytetown的市长计划定位一些雷达速度 在城市的相机。 Bytetown有n个交叉点编号 从1到n,和n-1双向街道段。这些街道都是这样的 段在两个交叉点之间延伸。街道网络 允许从每个交叉路口到达任何其他路口。
速度摄像机位于交叉路口(最多一个) 每个交叉点),其中市长希望最大化数量 速度相机。但是,为了不加剧Byteland 驾车者太多了,他决定在每条路线上跑来跑去 Bytetown道路两次没有通过任何交叉路口 可以是最大k速相机(包括那些在端点上的相机) 路线)。你的任务是写一个程序,它将确定在哪里 应该找到高速摄像机。
输入
第一行输入包含两个整数n和k(1 <= n,k <= 1000000):Bytetown中的交叉点数量和最大数量 可以在单独路线上设置的高速摄像机。线条 以下描述Bytetown街道网络:第i行包含 两个整数a_i和b_i(1&lt; = a_i,b_i&lt; = n),意味着有一个 连接两个交叉点的双向街道段,编号为a_i和 b_i。
输出
第一个输出行应该产生m:描述的数字 可以在Byteland中设置的最大速度摄像机数量。该 第二行应该产生一系列m个数字来描述 应该建造高速摄像机的交叉路口。应该 有很多解决方案,你的程序可以输出其中任何一个。 实施例
对于以下输入数据:
5 2
1 3
2 3
3 4
4 5
其中一个正确的结果是:
3
1 2 4
所以根据有多少球队解决它来判断,我猜它不会太难但是,我几乎立即陷入困境,不知道如何继续前进。因为我们知道“在穿过Bytetown道路的每条路线上都没有通过任何交叉路口两次可以有最大k速度摄像机”,我想我们首先必须以某种方式将图形剖析成可能在城镇周围路线的组件。仅此一点似乎是一件非常困难的事情,因为假设有四条高速公路从它出来,它已经为每个进入点创建了三个可能的方向,从而形成了12条路线。更不用说当有更多这样的四手交叉点时情况会变得复杂。
也许我从错误的角度接近任务?你能帮忙吗?
答案 0 :(得分:1)
这里看起来很贪婪
while k >= 2
mark all leaves of the tree and remove them
k = k - 2;
if ( k == 1 )
mark any 1 of remaining vertices