problem description
給你乙個n*n的格仔的棋盤,每個格仔裡面有乙個非負數。
從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大。
input
包括多個測試例項,每個測試例項包括乙個整數n 和n*n個非負數(n<=20)
output
對於每個測試例項,輸出可能取得的最大的和
sample input
375 15 21
75 15 28
34 70 5
sample output
188author
ailyanlu
source
正解:網路流
解題報告:
網路流24題第9題。同樣是可以轉換為最大點權和獨立集,求最小割跑最大流。自己的題解:
模型:建圖+最小割
總結:和前面做的幾道題很類似,都是求最大獨立集。事實上都可以轉換成二分圖,然後按照最小割模型來做。
考慮這道題說不能選取有相鄰邊的格仔中的數,相當於是如果選取了當前格仔,那麼周圍相鄰的四個格仔都不能再選。這個模型顯然就是乙個二分圖,所以首先我們可以先把全圖進行二分圖染色,對於乙個點座標為(i,j
),如果(
i+j)
%2==0
,那麼染成白色;否則,染成黑色。然後新建源點
s,向所有白色點連一條容量為該點點權的有向邊;新建匯點
t,所有黑色點連一條容量為該點點權的有向邊。對於所有白色點,向四周的所有黑色點都連一條容量為無窮的有向邊。如此以來我們構出了一張圖
(跟前幾道題一樣的說)。
顯然我們希望得到選取的盡可能多的格仔,由於都是正數所以肯定能選盡量選。但是如果選了乙個格仔,就意味著四周的全都不能再選了,也就是說如果我們把ans
初值記為所有格仔權值之和,那麼我們每次因為選擇了乙個格仔就會失去周圍四個的權值,需要從
ans中減掉。這跟什麼很像呢?最大半連通子圖!是的,一樣的做法,用總的和減去最小割就可以得到我們期望的最大值。
1//it is made by jump~
2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include
13#ifdef win32
14#define ot "%i64d"
15#else
16#define ot "%lld"
17#endif
18using
namespace
std;
19 typedef long
long
ll;20
const
int maxn = 501;21
const
int maxm = 500011;22
const
int inf = (1
<<30
);23
intn,sum,s,t,ecnt,ans;
24int a[maxn][maxn],deep[maxn*maxn];
25int first[maxn*maxn];
26 queueq;
27struct
edgee[maxm];
3031 inline int
getint()
3240
41 inline void link(int x,int y,int
z)45
46 inline bool
bfs()56}
57if(deep[t]!=0) return
true;58
return
false;59
}6061 inline int dinic(int x,int
remain) else deep[v]=-1;72
}73}74
return
flow;75}
7677 inline void
work()
91 ans=0;92
while(bfs()) ans+=dinic(s,inf);
93 printf("
%d\n
",sum-ans);94}
95}9697
intmain()
98
HDU 1565 方格取數 1
hdu 1565 方格取數 1 我的第乙個狀態壓縮dp 給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數,從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大 3 75 15 21 75 15 28 34 70 5 188對於每乙個數...
HDU 1565 方格取數 1
problem description 給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數。從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大。input 包括多個測試例項,每個測試例項包括乙個整數n 和n n個非負數 n 20 ou...
hdu 1565 方格取數 1
這個題網上很多人都說用狀態壓縮dp來做,我就是覺得狀態壓縮dp有點那麼理解不上啊,不過如果這個題吧相鄰的兩個格仔連起來,那不就是求最大權獨立點集嗎?奮戰了三天,我的第一道最大流題目終於寫出來了,高興啊!include include include include include include i...