POJ 3020 匈牙利演算法 狀壓DP

2021-10-03 12:49:51 字數 2282 閱讀 1826

大致題意

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之間的雙向邊要拆成...