網路流二十四題之九 方格取數問題(GRID)

2021-07-11 19:28:56 字數 1539 閱讀 2938

在乙個有 mn

個方格的棋盤中,每個方格中有乙個正整數。

現要從方格中取數,使任意

2 個數所在方格沒有公共邊,且取出的數的總和最大。

試設計乙個滿足要求的取數演算法。

檔案第

1行有

2 個正整數 m和

n ,分別表示棋盤的行數和列數。

接下來的

m行,每行有

n 個正整數,表示棋盤方格中的數。

程式執行結束時,將取數的最大總和輸出到檔案中。

3 3

1 2 3

3 2 3

2 3 1

m,

n 均為小於

30的正整數,方格中的數都為正整數。

第一次做棋盤形的網路流,有點小激動。

一看就覺得這個題目有點水。

把橫座標和縱座標相加為偶數的格仔往四周連容量為無限大的邊。

將源點與(橫座標和縱座標相加為偶數的格仔)連一條容量為其格仔上的數字的邊。

將匯點與(橫座標和縱座標相加為奇數的格仔)連一條容量為七個字上的數字的邊。

求最小切割,然後用所有的數字之和減去最小切割即可。

[cpp]

#include 

#include 

#include 

#include 

#define min(x,y) ((x)<(y)?(x):(y))

#define pla(x,y) ((((x)-1)*n)+(y))

#define inf 0x3f3f3f3f

#define ss 9999

#define tt 10000

using

namespace std;  

int m,n,cnt,sum;  

int map[30][30];  

int head[101000],nxt[1000010];  

int data[1000010],flow[1000010];  

int dis[101000];  

queueq;  

void add(int x,int y,int z)  

bool bfs()  

}  }  

return dis[tt]>0;  

}  int dfs(int now,int low)  

}  }     

return 0;  

}  int main()  

else

add(pla(i,j),tt,map[i][j]);  

sum+=(map[i][j]);  

}  int flag,weight=0;  

while(bfs())  

while(flag=dfs(ss,inf))weight+=flag;  

printf(」%d\n」,sum-weight);  

return 0;  

}  

網路流24題09方格取數問題

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

網路流24題 13 方格取數問題

這道題與上一道騎士共存問題非常的類似,首先也是黑白染色得到一張二分圖,s向黑連邊,白向t連邊,流量均為點權,然後黑點與會起衝突的白點連邊,那麼如果有一條從s 黑 白 t的路徑,證明有衝突,我們以割掉這條邊 黑點與s的連邊,白點與t連邊 表示拿走這個點,希望剩下的權值最大,所以模型轉換為最小割。求個最...

網路流24題 09 方格取數問題

問題描述 在乙個有m n 個方格的棋盤中,每個方格中有乙個正整數。現要從方格中取數,使任 意2 個數所在方格沒有公共邊,且取出的數的總和最大。試設計乙個滿足要求的取數演算法。程式設計任務 對於給定的方格棋盤,按照取數要求程式設計找出總和最大的數。資料輸入 由檔案grid.in提供輸入資料。檔案第1 ...