POJ 3020(最小路徑覆蓋 拆點)

2022-07-27 07:06:09 字數 2329 閱讀 4484

題意:乙個矩形中,有n個城市』*』,現在這n個城市都要覆蓋無線,若放置乙個基站,那麼它至多可以覆蓋相鄰的兩個城市。

問至少放置多少個基站才能使得所有的城市都覆蓋無線?

思路:每個城市才是要構造的二分圖的頂點,先把每個*用數字1-n標記起來,然後構造無向二分圖,無向二分圖的構造需要拆點,即12之間的雙向邊要拆成兩條有向邊,1—>2',2—>1'。且點集(1,2)(2',1')分別屬於二分圖的兩個頂點集v1,v2。再跑一遍匈牙利,結果就是 「頂點數—最大匹配數/2」。

二分圖的一點小知識:

最大匹配: 圖中包含邊數最多的匹配稱為圖的最大匹配。

完美匹配: 如果所有點都在匹配邊上,稱這個最大匹配是完美匹配。

最小覆蓋: 最小覆蓋要求用最少的點(x集合或y集合的都行)讓每條邊都至少和其中乙個點關聯。可以證明:最少的點(即覆蓋數)=最大匹配數

最小路徑覆蓋:

用盡量少的不相交簡單路徑覆蓋有向無環圖g的所有結點。解決此類問題可以建立乙個二分圖模型。把所有頂點i拆成兩個:x結點集中的i和y結點集中的i',如果有邊i->j,則在二分圖中引入邊i->j',設二分圖最大匹配為m,則結果就是n-m。

最大獨立集問題:

在n個點的圖g中選出m個點,使這m個點兩兩之間沒有邊.求m最大值.

如果圖g滿足二分圖條件,則可以用二分圖匹配來做.最大獨立集點數 = n - 最大匹配數。

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 

8 #include 9 #include 10 #include 11 #include 12 #include 13 #include

14 #include 15 #include 16

#define x first

17#define y second

18#define pb push_back

19#define mp make_pair

20#define lson l,m,rt*2

21#define rson m+1,r,rt*2+1

22#define mt(a,b) memset(a,b,sizeof(a))

23using

namespace

std;

24 typedef long

long

ll;25

//const double pi = acos(-1);

26const

int n=4e2+10;27

const ll mod=1e9+7;28

const

int inf = 0x3f3f3f3f;29

const ll inf=0x3f3f3f3f3f3f3f3fll;

30int

un,vn,n;

31int

g[n][n];

32int

linker[n];

33bool

used[n];

34char

s[n][n];

35int

vis[n][n];

36bool dfs(int

u)3748}

49}50return

false;51

}52inthungary()

5361

return

res;62}

63int

main()

6483

for(int i=0;i)

8492}93

}94for(int i=0;i)

95105

if(i-1>=0&&vis[i-1

][j])

106110

if(j+11])

111115

if(j-1>=0&&vis[i][j-1

])116

120}

121}

122}

123 un=vn=k;

124 cout<2-1

<

125}

126#ifdef local

127 cerr << "

time:

"<< (ll) clock() * 1000 / clocks_per_sec << "ms"

<

128#endif

129 }

view code

(拆點 最小路徑覆蓋) bzoj 2150

time limit 10 sec memory limit 259 mb submit 518 solved 298 submit status discuss lanzerb的部落在a國的上部,他們不滿天寒地凍的環境,於是準備向a國的下部征戰來獲得更大的領土。a國是乙個m n的矩陣,其中某些地方...

poj 3020 最小邊覆蓋與最大匹配 匈牙利演算法

做了一些題之後感覺自己的知識儲備真的太少了,很多東西都不知道 題目大意 乙個矩形中,有n個城市 現在這n個城市都要覆蓋無線,若放置乙個基站,那麼它至多可以覆蓋相鄰的兩個城市。問至少放置多少個基站才能使得所有的城市都覆蓋無線?解題思路 思前想後,依稀可以認為是一道求二分圖的最小路徑覆蓋問題 注意不是最...

最小路徑覆蓋問題(最小路徑覆蓋)

本題題目描述可以發現很明顯的最小路徑覆蓋問題,又因為最小路徑覆蓋 節點數 二分圖最大匹配數,所以本題可以用匈牙利演算法求出二分圖最大匹配數,也可以向第一題那樣用網路流模型求出最大匹配數。本題建模時不同在於,每個點要分成兩個點,乙個為起點,乙個為終點,再來求二分圖最大匹配。然後麻煩就在於本題也要輸出路...