程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 3657

HDU 3657

編輯:C++入門知識

本題是HDU 1565的加強版


題目描述:n*m的矩陣,每個位置都有一個正數,一開始你的分數是0,當你取走一個數字時,你的分數增加那個分數。如果你取完數字後,新出現了2個相鄰的都是空的格子,那麼你的分數減少2* ( x & y),x,y是那兩個格子的原始數值。

同時有一些附加條件,有一些格子的數字是必須拿走的。

解題報告:

首先,這種相鄰格子的問題都會想到它是一個二分圖:

橫縱坐標為偶數的在左邊,橫縱坐標為奇數的在右邊。

構圖如下:

一個超級原點,和左邊的點相連接,容量是其權值。

一個超級匯點,右邊的點和其連接,容量是其權值。

如果左邊的點x和右邊的點y相鄰,連接x,y容量為2 * (x & y)

這樣的圖的最小割的定義是:

一個完整的取數過程中的最小花費。

左邊的點x和原點連接表示選x,不連接(切斷,割)表示不選x,代價就是x的權值。同理右邊的點也是。

如果左邊的x和原點連接,右邊的y和匯點連接,那麼滿足割的定義,xy之間如果有邊,一定要切斷,代價就是2 * (x& y)。

同時,為了滿足一定要取一些點的附加條件,只要讓那些點和對應的原點或者匯點容量為無窮大就可以了,這樣割一定不會割那條無窮大。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved