洛谷2774 方格取數問題 網路流

2021-09-28 20:39:18 字數 1291 閱讀 8142

思路:根據題意可以將圖中的點分成兩種點,一種(i+j)為奇數的點(紅點),一種(i+j)為偶數的點(黑點),i為橫座標,j為縱座標,設乙個超級起點和乙個超級終點,起點到紅點建正向邊和反向邊,正向邊權值為該紅點的值,紅點到黑點建邊,黑點到終點建邊,權值為黑點的值,然後跑網路流,輸出為所有的點的總和減去最大流

ac**:

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define ll long long

const int mod=1e9+7;

const int inf=0x3f3f3f3f;

const ll inff=0x3f3f3f3f3f3f3f3f;

const ll n=105;

const ll m=105;

#define mef(x) memset(x,-1,sizeof(x))

#define me0(x) memset(x,0,sizeof(x))

#define mei(x) memset(x,inf,sizeof(x))

using namespace std;

ll poww(ll a,ll b)

return ans;

}struct edge

edge[n*m*16];

int cnt,first[n*m],dis[n*m];

void init()

void add(int u,int v,int w)

int n,m,al[n][m],sal;

int fx=;

int bfs(int s,int t)//建層次圖

for(int i=first[x];i!=-1;i=edge[i].next)}}

if(dis[t]==-1)

else

}int dfs(int s,int flow)//flow 到大某一節點的最大流

int ans=0;

for(int i=first[s];i!=-1;i=edge[i].next)}}

return ans;//某一節點的最終流量

}int dinc(int s,int t)

return flow;

}int main()

}init();

for(int i=1;i<=n;i++)}}

else}}

cout

}

洛谷P2774 方格取數問題

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

洛谷 P2774 方格取數問題

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

洛谷P2774 方格取數問題

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