題意:給出m*n的格仔,每個格仔裡都有數字,問你怎麼樣取數字能使其和最大,前提是取出來的格仔不能兩兩相鄰。
坑爹:如果按照方格取數的方法教上去會超時。
解法:struct edge //記錄邊
;用dinic演算法,裡面有兩個部分比較重要,乙個是bfs,另乙個是dfs。
bfs:利用bfs來對圖進行乙個分層,如圖所示。
最小流量,回溯的時候改變cap的值。
然後就是每次呼叫bfs看下能不能找到匯點,如果不能的話就結束,能找到的話就dfs計算出當前這個層次圖的最大流量,
然後再bfs迴圈做上述操作。
view code
1 #include2 #include3using
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連一條邊,容量為該點的...