方格取數 2 (網路流)

2021-08-15 10:55:23 字數 1515 閱讀 6347

題目:

給你乙個m*n的格仔的棋盤,每個格仔裡面有乙個非負數。 

從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取數所在的2個格仔不能相鄰,並且取出的數的和最大。

input

包括多個測試例項,每個測試例項包括2整數m,n和m*n個非負數(m<=50,n<=50)

output

對於每個測試例項,輸出可能取得的最大的和

sample input

3 375 15 21 

75 15 28 

34 70 5

sample output

188思路:

本題要充分發揮想象,建模是關鍵。

將棋盤分為黑白棋子,(黑與白呈格仔狀)建立超級源點s,假設座標(1,1)為代表的是白棋。白棋與超級源點相連,flow為該點的值。黑棋與超級匯點相連,flow為該點的值。將白棋與上下左右相連,流量為inf,跑一遍最大流,用所有的權值減去最大流即為答案。

#include#include#include#includeusing namespace std;

int n,np,nc,m;

char x;

int point,point2,point3;

const int maxe = 200000;

const int maxn = 8000;

const int maxq = 200000;

const int oo = 1e+9;

const int inf=0x3f3f3f3f;

struct edge edge[maxe];//邊組

int adj[maxn], cnte;//前向星的表頭

int q[maxq], head, tail;//佇列

int d[maxn], cur[maxn], pre[maxn], num[maxn];

int source, sink, nv;//sourse:源點,sink:匯點,nv:編號修改的上限

void add(int u, int v, int c)

void rev_bfs ()

}}int isap()

}for (i = source; i != sink; i = edge[cur[i]].v)

flow += f;//更新

u = neck;//回退

}for (i = cur[u]; ~i; i = edge[i].n) if (d[edge[i].v] + 1 == d[u] && edge[i].c) break;

if (~i)

else

}d[u] = mind + 1;

num[d[u]]++;

u = pre[u];//回退}}

return flow;

}void init ()

int main()

}for(int i=1;i<=n;i++)

else

add((i-1)*m+j,sink,a[i][j]);}}

cout<

hdu 1569 方格取數 2 網路流

題意 給出乙個n m的矩陣,求選出若干個互不不相鄰 的數,使得和最大 分析 劉汝佳白書給出求帶權二分圖的最大獨立集解法。即每個節點有乙個權值,要求選出一些節點,互不相鄰,且權值最大 加入乙個源點s和乙個匯點t,使得s向其中乙個集合的點連一條邊,容量為該點的權值,另一部分的點向t連一條邊,容量為該點的...

codevs1907 網路流24題 方格取數3

最小割 這道題都是做最小割例題來講的,終於真正寫了一次.先黑白染色 源點向黑點連容量為num的邊 黑點向白點連容量為inf的邊 白點向匯點連容量為nun的邊 跑最小割,也就是最大流 建圖很簡單但是很難理解,我的理解就是為了把他們分開選取了最小的割,剩下的圖中的點就是不連通的了,感覺比賽的時候出一道最...

方格取數 網路流

大致題意 給你乙個 n m 的矩陣,可以取任意多個數,但若你取了乙個數,那麼這個數上下左右的數你就都不能取,問能取到的最大值是多少。首先,我們可以把矩陣上的點都染成兩種顏色 第乙個點為黑色,它會影響的點為白色,這樣做下去 那麼我們就可以得到乙個二分圖,此時我們注意到,我們要做的是把這個二分圖按照衝突...