大致題意
h * w 的網格中有一些點,需要用天線覆蓋。乙個天線只能覆蓋橫向或豎向相鄰的 2 個點。求使用天線的最少數量。1 <= h <= 40, 0 < w <= 10
匈牙利演算法
匈牙利演算法即搜尋交錯路(未匹配邊->匹配邊->未匹配邊)求最大匹配,更通俗一點就是,當需要匹配的點原來的匹配點可以匹配其他的點時,可以進行匹配。
這裡的圖是一般圖,若當二分圖做,(u, v)∈e ,則對於任一頂點x,x∈u, x∈v ,則任一對頂點匹配後要同時對兩側頂點做記錄,避免多次匹配。
#include
#include
#include
#include
#define min(a,b) (((a) < (b)) ? (a) : (b))
#define max(a,b) (((a) > (b)) ? (a) : (b))
#define abs(x) ((x) < 0 ? -(x) : (x))
#define inf 0x3f3f3f3f
#define delta 0.85
#define eps 1e-3
#define m_pi 3.14159265358979323846
#define max_n 400
using
namespace std;
const
int dx[4]
=;const
int dy[4]
=;int n, h, w;
int mp[40]
[10];
vector<
int> g[max_n]
;bool used[max_n]
;int match[max_n]
;bool
judge
(int x,
int y)
bool
dfs(
int v)
}return0;
}int
main()
}}//鄰接表初始化
for(
int i =
0; i < n; i++
) g[i]
.clear()
;for
(int x =
0; x < h; x++)}
}}//求解匹配兩個點的天線數
int pn =0;
memset
(match,-1
,sizeof
(match));
for(
int v =
0; v < n; v++)}
printf
("%d\n"
, n - pn);}
return0;
}
狀壓dp
類似鋪磚問題的做法,對每一列未搜尋到的最上面乙個格仔進行狀態壓縮,共 2w 種狀態。每次從左上角的點開始搜尋,有橫放與豎放 2 中放置方法。
dp[x][y][s] 代表從狀態 s,座標 x, y 開始搜尋,覆蓋全部點需要的最少天線數。
#include
#include
#include
#define min(a,b) (((a) < (b)) ? (a) : (b))
#define max(a,b) (((a) > (b)) ? (a) : (b))
#define abs(x) ((x) < 0 ? -(x) : (x))
#define inf 0x3f3f3f3f
#define delta 0.85
#define eps 1e-3
#define m_pi 3.14159265358979323846
#define max_n 10
using
namespace std;
int h, w;
int mp[40]
[10];
int dp[40]
[10][
1<<10]
;int
rec(
int x,
int y,
int s)
intmain()
}}memset
(dp,-1
,sizeof
(dp));
printf
("%d\n"
,rec(0
,0,0
));}
return0;
}
poj 3020 最小邊覆蓋與最大匹配 匈牙利演算法
做了一些題之後感覺自己的知識儲備真的太少了,很多東西都不知道 題目大意 乙個矩形中,有n個城市 現在這n個城市都要覆蓋無線,若放置乙個基站,那麼它至多可以覆蓋相鄰的兩個城市。問至少放置多少個基站才能使得所有的城市都覆蓋無線?解題思路 思前想後,依稀可以認為是一道求二分圖的最小路徑覆蓋問題 注意不是最...
POJ3020 二分匹配
思路 說給自己 一開始想的是從1 h w標記整幅圖,建圖是星號和 建邊,肯定要去匹配 啊,所以空格一定不會去造,然後就理解成了最小點覆蓋,然而對於最小點覆蓋,對於 孤立點 也就是沒有連出去的邊 這樣就錯了。但是對於這個思路還是打完了,然後發現錯了。其實對於 正確 思路要先想想是嘛。正解 這題題意是乙...
POJ 3020(最小路徑覆蓋 拆點)
題意 乙個矩形中,有n個城市 現在這n個城市都要覆蓋無線,若放置乙個基站,那麼它至多可以覆蓋相鄰的兩個城市。問至少放置多少個基站才能使得所有的城市都覆蓋無線?思路 每個城市才是要構造的二分圖的頂點,先把每個 用數字1 n標記起來,然後構造無向二分圖,無向二分圖的構造需要拆點,即12之間的雙向邊要拆成...