飞机轰炸问题 - 帮助

时间:2010-05-31 15:02:55

标签: algorithm

我正在训练代码问题,在这一方面我遇到问题需要解决它,你能不能给我一些如何解决它的提示。

问题来自这里:

https://www.ieee.org/documents/IEEEXtreme2008_Competitition_book_2.pdf

问题12:愤世嫉俗的时代。

问题是这样的(但是请参考上面的源问题链接,它有一个图表!):

你的任务是在地图上找到轰炸机预计行驶的点序列,以便击中所有重要的链路。从A到B的链接在其缺失时完全将A与B隔离开来是至关重要的。换句话说,从A到B(反之亦然)的唯一方法是通过该链接。

由于敌人的反击,飞机可能不得不随时撤退,因此飞机应该在每个时刻跟随可能的最近的重要链路,即使最终总距离变大。

给定所有坐标(平面的初始位置和地图中的节点)和范围R,您必须确定飞机必须投下炸弹的位置顺序。

此序列应在初始位置开始(起飞)并完成(着陆)。除了开始和结束之外,所有其他位置必须精确地落在地图的一段中(即,它应该对应于未命中的重要链接段中的点)。

使用的坐标系统是UTM(Universal Transverse Mercator)北向和东向,它基本上对应于世界的欧几里德视角(X = Easting; Y = Northing)。

输入 每个输入文件将以三个浮点数开始,表示机场的X0和Y0坐标以及范围R.第二行包含一个整数N,表示道路网络图中的节点数。然后,接下来的N(<10000)行将各自包含一对指示Xi和Yi坐标的浮点数(1

没有两个链接会相互交叉。

输出 程序将按照飞机应该访问的顺序(在机场开始和结束)打印坐标序列(成对的浮点数,只有一个小数位),每个坐标在一条线上。

Sample input 1

102.3 553.9 0.2 
14 
342.2 832.5 
596.2 638.5 
479.7 991.3 
720.4 874.8 
744.3 1284.1 
1294.6 924.2 
1467.5 659.6 
1802.6 659.6 
1686.2 860.7 
1548.6 1111.2 
1834.4 1054.8 
564.4 1442.8 
850.1 1460.5 
1294.6 1485.1 
17 
1 2 
1 3 
2 4 
3 4 
4 5 
4 6 
6 7 
7 8 
8 9 
8 10 
9 10 
10 11 
6 11 
5 12 
5 13 
12 13 
13 14 

Sample output 1
102.3 553.9 
720.4 874.8 
850.1 1460.5 
102.3 553.9 

3 个答案:

答案 0 :(得分:1)

  1. 首先预处理输入,以便识别阻塞点。像Floyd-Warshall这样的算法可以帮到你。
  2. 将问题建模为启发式搜索问题,您可以计算覆盖所有阻塞点的MST,并将边缘成本的总和作为启发式算法。
  3. 正如评论者所说,试着在这里或TA监督你的班级提出具体问题。
  4. 别忘了提到你得到这些提示的地方。

答案 1 :(得分:1)

问题可以分为两部分。

1)找到重要的链接。

这些只不过是图中描述的Bridges。查看维基页面(链接到上一句),它提到了Tarjan找到桥梁的算法。

2)一旦你拥有了重要的链接,你需要找到给出炸弹半径的最小点数,将覆盖链接。为此,对于每个链接,您在其周围创建一个区域,丢弃炸弹将破坏它。现在,您可以形成这些区域的图形(如果它们相交,则两个区域相邻)。您可能需要在此图表中找到最小clique partition

没有考虑过(特别是第2部分),但希望它有所帮助。

祝你好运!

答案 2 :(得分:0)

我认为 Moron '对于第一部分是正确的,但在第二部分...... 问题描述并未说明“最小点数”。它告诉飞机飞到最近的重要链路。 所以,我认为第2部分会更简单:

  • 找到距离当前位置最近的未命中分段。
  • 前往最近段的最近点。
  • 炸弹当前位置(移除与圆相交的所有线段)
  • 重复,直到没有未命中的重要链接。

这种直接算法的复杂度为O(N * N),但考虑到输入约束,这应该足够了。