HDU1565 方格取數 1

2022-05-08 07:45:08 字數 2350 閱讀 2262

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...