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