洛谷P2774 方格取數問題

2022-08-13 23:12:13 字數 1103 閱讀 6988

在乙個有 m*n 個方格的棋盤中,每個方格中有乙個正整數。現要從方格中取數,使任意 2 個數所在方格沒有公共邊,且取出的數的總和最大。

我們將問題轉化為:一開始所有格仔都選,之後去掉價值和最少的一些格仔使剩下的格仔合法。

將方格黑白染色,白格仔連向s,黑格仔連向t,邊權為這個格仔的值(也就是說將格仔轉移到邊上)。

相鄰的黑白格仔間連inf的邊。(這樣每條從s到t的路徑都為 s->白格仔->黑格仔->t , 這兩個格仔不能同時選,s->白格仔 與 黑格仔->t 間必然會割掉一條邊)

注意乙個小trick:對於永遠不被割掉的邊,邊權設為inf

這樣跑完最小割後,剩下的格仔是合法的。而最小割的容量便為去掉的那些格仔的價值和。

#include#include#include#define inf 2000000000

using namespace std;

typedef long long ll;

const int n = 10005;

struct nodepool[n*20],*h[n];

int cnt;

void addedge(int u,int v,int f)

int s,t;

int que[n],level[n];

bool bfs()

if(level[t]!=-1) return true;

}

return false;

}int find(int u,int f)

}if(!s) level[u]=-1;

return s;

}ll dinic()

int n,m;

int val[105][105];

bool check(int x,int y)

int main()

for(int dx=-1;dx<2;dx++)

for(int dy=-1;dy<2;dy++)

if(dx*dy==0 && dx!=dy)

}sum-=dinic();

printf("%lld\n",sum);

return 0;

}

洛谷P2774 方格取數問題

洛谷p2774方格取數問題 題目鏈結 將題目反著考慮,假設現在所有數都取,需要刪掉一部分數,使得剩下的數沒有公共邊且刪掉的數之和最小。容易發現,兩個位置有公共邊當且僅當他們橫縱座標的和的奇偶性不同。建立乙個二分圖,左邊為座標和為奇數的點,右邊為座標和為偶數的點,將左右兩邊存在公共邊的點連起來。s向左...

洛谷 P2774 方格取數問題

通過題目描述我們可以很明顯的看出要通過二分圖建模,二分圖求最大獨立點集很容易,就是建立二分圖求n 最小割,然而這裡加入了權值,而且權值是在點上的,那麼我們對於每個點連一條到源點或匯點的容量等於權值的邊,求最小割即可,見胡伯濤 include include include include inclu...

洛谷P2774 方格取數問題

題目鏈結 將題目反著考慮,假設現在所有數都取,需要刪掉一部分數,使得剩下的數沒有公共邊且刪掉的數之和最小。容易發現,兩個位置有公共邊當且僅當他們橫縱座標的和的奇偶性不同。建立乙個二分圖,左邊為座標和為奇數的點,右邊為座標和為偶數的點,將左右兩邊存在公共邊的點連起來。s向左邊的每個點建邊,權值為點的權...