hdu 1565 最大點權獨立集

2022-06-02 13:03:12 字數 2149 閱讀 1094

題意:給你乙個m*n的格仔的棋盤,每個格仔裡面有乙個非負數。從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取數所在的2個格仔不能相鄰,並且取出的數的和最大。

分析**:點我

二分圖最小點覆蓋和最大獨立集都可以轉化為最大匹配求解。在這個基礎上,把每個點賦予乙個非負的權值,這兩個問題就轉化為:二分圖最小點權覆蓋和二分圖最大點權獨立集。

二分圖最小點權覆蓋

從x或者y集合中選取一些點,使這些點覆蓋所有的邊,並且選出來的點的權值盡可能小。

建模:

原二分圖中的邊(u,v)替換為容量為inf的有向邊(u,v),設立源點s和匯點t,將s和x集合中的點相連,容量為該點的權值;將y中的點同t相連,容量為該點的權值。在新圖上求最大流,最大流量即為最小點權覆蓋的權值和。

二分圖最大點權獨立集

在二分圖中找到權值和最大的點集,使得它們之間兩兩沒有邊。其實它是最小點權覆蓋的對偶問題。答案=總權值-最小點覆蓋集。具體證明參考胡波濤的**。

先理理概念:

點覆蓋集:無向圖g的乙個點集,使得該圖中所有邊都至少有乙個端點在該集合內。

最小點權覆蓋集:在帶點權無向圖g中,點權之和最小的覆蓋集。

點獨立集:無向圖g的乙個點集,使得任兩個在該集合中的點在原圖中都不相鄰。

最大點權獨立集:在帶權無向圖g中,點權之和最大的獨立集。

定理:1. 最小點權覆蓋集=最小割=最大流

2. 最大點權獨立集=總權-最小點權覆蓋集

思路:1. 先染色,取乙個點染白色,和它相鄰的點染黑色

2. 每個白點向它相鄰的黑點連一條邊,容量為 inf (無窮大)

3. 增加源點s,向每乙個白色點連一條邊,容量為白點的權

4. 增加匯點t,每個黑點向t連一條邊,容量為黑點的權

1 #include2 #include3 #include4

using

namespace

std;

5#define maxn 5555

6#define maxm 222222

7#define inf 1<<3089

struct

edgeedge[maxm];

1213

inthead[maxn];

14int

pre[maxn];

15int

cur[maxn];

16int

level[maxn];

17int

gap[maxn];

18int

ne,nv,n,vs,vt;

19int dir[4][2]=,,,};

20int map[55][55

];21

bool mark[55][55

];22

23void insert(int u,int v,int cap,int cc=0)30

31int sap(int vs,int

vt)52 aug=-1;53

}54goto

loop;55}

56}57int minlevel=nv;

58for(int i=head[u];i!=-1;i=edge[i].next)64}

65 gap[level[u]]--;

66if(gap[level[u]]==0)break

;67 level[u]=minlevel+1

;68 gap[level[u]]++;

69 u=pre[u];70}

71return

maxflow;72}

7374

intmain()85}

86for(int i=1;i<=n;i++)99}

100}

101}

102}

103 printf("

%d\n

",sum-sap(vs,vt));

104}

105return0;

106 }

2015/5/31

hdu 3657 最大點權獨立集)

思路我就不詳細講了,這位大牛講的很清楚 1 include2 include3 include4 define maxn 55 5 define maxm 55 55 6 define inf 1 30 7using namespace std 8struct edgeedge maxm 11 11...

最小點權覆蓋和最大點權獨立集

1 最小點權覆蓋與最大點權獨立集 定義 二分圖又稱作二部圖,是圖論中的一種特殊模型。設 g v,e 是乙個無向圖,如果頂點 v 可分割為兩個互不相交的子集 a,b 並且圖中的每條邊 i,j 所關聯的兩個頂點i和j分別屬於這兩個不同的頂點集 i in a,j in b 則稱圖g為乙個二分圖。給定乙個二...

HDU 1569 方格取數 2 最大點權獨立集

problem description 給你乙個m n的格仔的棋盤,每個格仔裡面有乙個非負數。從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取數所在的2個格仔不能相鄰,並且取出的數的和最大。input 包括多個測試例項,每個測試例項包括2整數m,n和m n個非負數 m 50,n 5...