題意:給你乙個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 #include42015/5/31using
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 }
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...