【問題描述】
在乙個有m * n 個方格的棋盤中,每個方格中有乙個正整數。現要從方格中取數,使任意2 個數所在方格沒有公共邊,且取出的數的總和最大。試設計乙個滿足要求的取數演算法。對於給定的方格棋盤,按照取數要求程式設計找出總和最大的數。
【輸入格式】
第1 行有2 個正整數m和n,分別表示棋盤的行數和列數。
接下來的m行,每行有n個正整數,表示棋盤方格中的數。
【輸出格式】
將取數的最大總和輸出
【輸入樣例】
3 3
1 2 3
3 2 3
2 3 1
【輸出樣例】
11【資料範圍】
1<=n,m<=30
正解:網路流
解題報告:對圖進行黑白染色,然後就變成了乙個二分圖,然後就是套結論二分圖最大獨立集等於權值和減去最小割。
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include8 #include 9
#define rg register
10#define min(a,b) a11
const
int n = 10000;12
const
int inf = 2147483641;13
14using
namespace
std;
1516
intgi()
2223
struct
datenn[n];
2627
int h[n],vis[n],f[n],head[n],cnt=1
,jl[n],gg;
28int
s,t,ans,kk;
2930
void link(int l,int r,int
val),head[l]=cnt;
32 nn[++cnt]=(date),head[r]=cnt;
33return;34
}3536int
bfs()
48if (vis[t]) return1;
49}50return0;
51}5253
int dinic(int xh,int
sum)
63if (s==0) vis[xh]=-1;64
return
s;65}66
67int
main()
86else
87 link(k+j,t,f[k+j]);88}
89}90while(bfs()) ans+=dinic(s,inf);
91 printf("
%d",kk-ans);
92return0;
93 }
24題 方格取數問題 網路流
在乙個有 n m n times m n m 個方格的棋盤中,每個方格中有乙個正整數。現要從方格中取數,使任意 2 個數所在方格沒有公共邊,且取出的數的總和最大。這道題明顯是乙個二分圖。我們可以把每個點染色,將i j i ji j為偶數的點連向t tt,否則連向s ss。那麼對於每乙個連s ss的白...
網路流24題 方格取數問題
題面 傳送門思路 相鄰的點不能同時取,那麼在這個圖中,實際上分了兩種格仔,每種格仔相互之間隨便取 那麼就是二分圖了 把相鄰的點之間連邊,得到乙個二分圖,我們實際上就是要求這個圖的帶權最大獨立集 於是這道題轉化為二分圖問題,而二分圖中最大獨立集等於全集減去最小點覆蓋,最小點覆蓋等於這個圖的最大匹配 都...
網路流24題 方格取數問題
在乙個有m n 個方格的棋盤中,每個方格中有乙個正整數。現要從方格中取數,使任意2 個數所在方格沒有公共邊,且取出的數的總和最大。試設計乙個滿足要求的取數演算法。對於給定的方格棋盤,按照取數要求程式設計找出總和最大的數。第1 行有2 個正整數m和n,分別表示棋盤的行數和列數。接下來的m行,每行有n個...