hdu 1565 方格取數(神奇的最小割,模板題)

2021-08-09 06:18:13 字數 1207 閱讀 3853

題目:

思路:最大流最小割:最大和=所有數之和—最小割(網路流)

建圖:奇數點連源點,然後以inf為容量連周圍偶數點,偶數點連匯點。

#include#include#include#include#include#include#define mem(a,x) memset(a,x,sizeof(a))

using namespace std;

const int inf = 0x3f3f3f3f;

const int maxn = 50 + 5;

const int maxs = maxn*maxn + 5;

int n,m,source,sink;

int mp[maxn][maxn];

struct edge;

struct dicnic;

edge e2 = ;

edges.push_back(e1);

edges.push_back(e2);

int m = edges.size();

g[from].push_back(m-2);

g[to].push_back(m-1);

}void init(int n)

edges.clear();

}bool bfs()}}

return vis[t];

}int dfs(int x ,int a)

}return flow;

}int maxflow(int s,int t)

return flow;

}}g;int drx = ;

int dry = ;

bool valid(int x,int y)

int id(int x,int y)

int main()

}else

sum+=mp[i][j];

}int ans = g.maxflow(source,sink);

printf("%d\n",sum-ans);

}return 0;}/*

60 31 1231 12 1 21

13 135 1321 1 3 21

132 132 5 15 3 12

13 453 321 45 0 0

35 534 4 531 124 12

13 135 1321 1 3 21

*/

HDU 1565 方格取數

第一道狀態壓縮dp,比較簡單,做得也比較暴力,不過還挺適合入門,貼個 紀念一下 include include include include include define pub push back define ll int64 using namespace std const int n 2...

HDU1565方格取數

典型的狀態壓縮dp問題。第i行的取法只受到第i 1行的影響。首先每一行的取法要相容 不能有兩個相鄰 然後相鄰行之間也要相容。將每乙個格仔看做兩種狀態,1表示取,0表示不取。這樣每一行就是乙個01串,恰好可以看做是乙個二進位制數,那麼該二進位制數對應的十進位制整數可以唯一的表示為當前第 i 行的狀態。...

HDU 1565 方格取數 1

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