方格取數3

2022-05-15 09:54:57 字數 1791 閱讀 2331

時間限制: 2 s

空間限制: 256000 kb

在乙個有m*n 個方格的棋盤中,每個方格中有乙個正整數。現要從方格中取數,使任

意2 個數所在方格沒有公共邊,且取出的數的總和最大。試設計乙個滿足要求的取數演算法。

程式設計任務:

對於給定的方格棋盤,按照取數要求程式設計找出總和最大的數。

輸入描述 input description

第1 行有2 個正整數m和n,分別表示棋盤的行數

和列數。接下來的m行,每行有n個正整數,表示棋盤方格中的數。

輸出描述 output description

將取數的最大總和輸出

樣例輸入 sample input

3 31 2 3

3 2 3

2 3 1

樣例輸出 sample output

資料範圍及提示 data size & hint

n,m<=30

最小割。由於題目要求不能選擇相鄰的兩個數,我們可以考慮給棋盤染色,白格仔只與黑格仔相鄰,反之亦然。源點都和某一種顏色的格仔相連,匯點和另一種顏色的格仔相連,權值為格仔裡的數。相鄰兩個格仔之間建一條流量為無窮大的邊,這樣就保證最小割只會選擇去除與源點或匯點相鄰的邊,而去除這條邊就意味著不選這個格仔裡的數。最後當最小割選擇完成後,源點和匯點沒有路徑相連,這就意味著沒有相鄰的格仔被同時保留。(因為源點和匯點連線必須要經過相鄰格仔之間的邊,而現在源點和匯點不相連,就意味著一旦某乙個格仔被選擇,它周圍的格仔都不能再被選擇了)。

#include#define n 1000

using

namespace

std;

long

long tot=0

;typedef

structss;

vector

long>edges[n];

ss edg[n*n];

long

long

dis[n];

long

long

s,t;

long

long

current[n];

void addedge(long

long u,long

long v,long

long

flow)

; edges[u].push_back(tot++);

edg[tot]=(ss);

edges[v].push_back(tot++);

}bool

bfs()}}

if(dis[t]==llong_max/2)return0;

return1;

}long

long dfs(long

long x,long

long

flow)}}

return0;

}long

long

dinic()

return

ans;

}int

main()

s=t++;

t=t++;

for(int i=1;i<=m;i++)

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

}printf(

"%lld

",ans-dinic());

return0;

}

view code

code vs 方格取數3

時間限制 2 s 空間限制 256000 kb 題目等級 大師 master 題解 檢視執行結果 問題描述 在乙個有m n 個方格的棋盤中,每個方格中有乙個正整數。現要從方格中取數,使任 意2 個數所在方格沒有公共邊,且取出的數的總和最大。試設計乙個滿足要求的取數演算法。程式設計任務 對於給定的方格...

1907 方格取數 3

時間限制 2 s 空間限制 256000 kb 題目等級 大師 master 題解檢視執行結果 問題描述 在乙個有m n 個方格的棋盤中,每個方格中有乙個正整數。現要從方格中取數,使任 意2 個數所在方格沒有公共邊,且取出的數的總和最大。試設計乙個滿足要求的取數演算法。程式設計任務 對於給定的方格棋...

方格取數 1

problem description 給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數。從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大。input 包括多個測試例項,每個測試例項包括乙個整數n 和n n個非負數 n 20 ou...