HDU 1569 方格取數 2 dinic演算法

2022-08-09 01:45:19 字數 1679 閱讀 4873

題意:給出m*n的格仔,每個格仔裡都有數字,問你怎麼樣取數字能使其和最大,前提是取出來的格仔不能兩兩相鄰。

坑爹:如果按照方格取數的方法教上去會超時。

解法:struct edge          //記錄邊

;用dinic演算法,裡面有兩個部分比較重要,乙個是bfs,另乙個是dfs。

bfs:利用bfs來對圖進行乙個分層,如圖所示。

最小流量,回溯的時候改變cap的值。

然後就是每次呼叫bfs看下能不能找到匯點,如果不能的話就結束,能找到的話就dfs計算出當前這個層次圖的最大流量,

然後再bfs迴圈做上述操作。

view code

1 #include2 #include3

using

namespace

std;45

const

int maxn = 50+10;6

const

int e_maxn = 50000 + 10;7

const

int inf = 0x3fffffff;8

9struct

edge10;

16struct

edge edge[e_maxn];

17int deep[maxn*maxn];

18int cur[maxn*maxn];

19int

k;20

intn;

21int

m;22

int temp[4][2] = ;

2324

int min(int a,int

b)25

2829

void addedge(int

from,int to,int

cap)

3044

45int judge(int x,int

y)46

51return0;

52}5354

bool

bfs()

5573}74

}75return deep[n*m+1] != -1;76

}7778int dfs(int x,int

a)79

84int flow = 0;85

for(int i=cur[x]; i!=-1 && flowedge[i].next)

8696}97

if(!flow)

98101

return

flow;

102}

103104

intdinic()

105114

}115

return

flow;

116}

117118

119int

main()

120146

}147

}148

else

149159

}160

}161

}162

}163

164int ans =dinic();

165 cout

166}

167return0;

168 }

hdu 1569 方格取數 2

題目大意 求在n m的棋盤中選出兩兩不相鄰的數,使得和最大。題目思路 按西洋棋黑白染色,源點到黑點容量為數字,黑點到它周圍的白點容量為無窮,白點到匯點容量為數字,最後答案為總值減去最小割 摘自網上 include include include include include include inc...

hdu 1569 方格取數 2

和上一題差不多,都是用最大流來做,可是有人能告訴我stl和直接用陣列,真的有那麼大區別嗎?stl超時,陣列0ms,這是什麼資料,有那麼叼嗎 附上兩份 希望過路的人能給我看看為什麼會超時 stl的 include include include include include include incl...

hdu 1569 方格取數 2 網路流

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