P2774 方格取數問題(最大流)

2021-09-10 02:07:06 字數 794 閱讀 7976

將所有點以橫縱座標和為奇數或偶數分成兩部分,建立二分圖,把相鄰的點都連邊,左右兩邊分別與源點和匯點相連。因為不能取相鄰的點,所以要去掉一些邊使剩餘的圖不含s到t的路徑。又要留下的點權和最大,所以需要去掉的點權和最小,所以是求最小割。因為最小割=最大流,所以讓每個點和源點或匯點的邊容量為點權,點和點之間的邊容量為inf,求最大流,再用所有點權和減最大流即可。

#include#include#include#includeusing namespace std;

const int n=10010,m=80000,inf=0x7fffffff;

struct edgedata[m];

int n,m,s,t,sum,num,h[n],dep[n],cur[n];

queueq;

inline int read()

while(ch>='0'&&ch<='9')

return f?-x:x;

} inline void add(int x,int y,int f)

inline bool bfs(int s,int t)

} }return dep[t];

}int dfs(int u,int t,int lim)

} }return res;

}inline int dinic(int s,int t)

int main()

else add(x,t,w);

} printf("%d",sum-dinic(s,t));

return 0;

}

P2774 方格取數問題

題目描述 在乙個有 m n 個方格的棋盤中,每個方格中有乙個正整數。現要從方格中取數,使任意 2 個數所在方格沒有公共邊,且取出的數的總和最大。試設計乙個滿足要求的取數演算法。對於給定的方格棋盤,按照取數要求程式設計找出總和最大的數。輸入格式 第 1 行有 2 個正整數 m 和 n,分別表示棋盤的行...

P2774 方格取數問題

none 在乙個有 m n 個方格的棋盤中,每個方格中有乙個正整數。現要從方格中取數,使任意 2 個數所在方格沒有公共邊,且取出的數的總和最大。試設計乙個滿足要求的取數演算法。對於給定的方格棋盤,按照取數要求程式設計找出總和最大的數。輸入格式 第 1 行有 2 個正整數 m 和 n,分別表示棋盤的行...

P2774 方格取數問題

對棋盤黑白染色,源點向黑點連邊,匯點向白點連邊,權值均為這個點的權值。然後所有的黑點向白點連一條 inf 的邊。這樣求出的最小割一定會割掉與源點和匯點相連的邊,割掉這條邊相當於不選這個點。所以最後答案就是所有點的權值 最小割。include include include include defin...