分享到plurk 分享到twitter 分享到facebook

[POJ] 3041 - Asteroids

網址

http://poj.org/problem?id=3041

題目概述

NxN的棋盤當中,包含了K個asteroids,

一次shot可以選擇射在一整行或一整列,可以消滅該整行/列的所有asteroids

問最少要多少次shot才能把K個asteroids都消滅?

Technique details

  • 1 <= N <= 500

  • 1 <= K <= 10000

輸入格式

只有一筆測資

第一行有兩個數字,分別是N和K

接下來K行,每行兩個數字,代表該asteroid所在的row col

輸出格式

輸出一個整數,代表最少要多少次shot

解題思路

針對每一個asteroid,只要選擇row或者選擇col就好

把每一個asteroid所對應到的row,col,想成row->col建一條邊

則asteroid本身代表的就是那條邊

問題就變成:

選擇最少的row或col,使得所有的邊(asteroid)都被覆蓋到

也就是Minimum Vertex Cover問題

又因為row跟row彼此之間沒有邊

col跟col彼此之間也沒有邊

所以問題變成in Bipartite Graph

而Minimum Vertex Cover in Bipartite Graph的答案

又等同於Maximum Bipartite Matching的答案

因此匈牙利即可

時間複雜度 O(N :sup:2)