hdoj 1565 方格取數 1 (最大流最小割)

2021-10-04 18:58:53 字數 1651 閱讀 9936

dinic模板:hdoj 3549 flowproblem(dinic+當前弧優化 模板)

題意:在方格中取數,不能取到相鄰的方格,求取數最大和。

解題思路:

題中對取數條件進行了約束,不能取相鄰的數,那麼這種約束可以通過網路流邊上的容量來刻畫,再用最大流最小割定理解決。

解題過程:

1、根據點的行+列的奇偶性進行染色,比如將行+列為奇數的染成黑色,行+列為奇數的染成白色。將黑色點與源點s連邊,邊的容量為點權;將白點與源點t連邊,邊的容量為點權;將黑色點與它周圍的白色點連邊,邊的容量為∞,代表這條邊不進入割。

2、題目要求取數最大值,也等於總值 - 不取的數的最小值,也就將問題轉換成了求最小割。若黑色點b1與源點s相連,白色點w1與源點t相連,b1與w1相連,那麼b1和w1不能同時取到,也就是說,b1與s的邊 和 w1與t的邊,必定有乙個要進入割。

3、根據最大流最小割定理,最小割在數值上與最大流相同,求出最大流即可。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define jojo cout<<"jojo"namespace std;

const

long

long inf =

~0ull

>>2;

const

int inf =

0x3f3f3f3f

;const

int maxn =

5e2+10;

int head[maxn]

, cur[maxn]

;int lev[maxn]

;int s =

0, t;

//s代表源點,t代表匯點

int t;

struct tagedgeedge[maxn*maxn/4]

;bool

levelgraph()

}}if(lev[t]==-

1)return

false

;else

return

true;}

intfindpath

(int k,

long

long flow_in)

}return flow_out;

}long

long

dinic()

return res;

}void

addedge

(int u,

int v,

long

long w)

void

init()

intmain()

if(i < n)

if(j >1)

if(j < n)

}else}}

printf

("%lld\n"

, sum-

dinic()

);}return0;

}

HDU 1565 方格取數 1

hdu 1565 方格取數 1 我的第乙個狀態壓縮dp 給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數,從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大 3 75 15 21 75 15 28 34 70 5 188對於每乙個數...

HDUOJ 1565 方格取數 1

題目鏈結 給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數。從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大。包括多個測試例項,每個測試例項包括乙個整數 n 和 n n個非負數 n 20 對於每個測試例項,輸出可能取得的最大的和 ...

HDU1565 方格取數 1

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