深入理解最小割的意義

2022-04-11 17:55:48 字數 1784 閱讀 9306

在做網路流題目的時候,我們時常因為無法正確建圖而遺憾錯過本應該的ac。

今天通過一些題目,我好好記錄一下自己對最大流、最小割的學習感受。

hdu 1565,題意:

給你乙個矩陣,矩陣上每個點上都有乙個數字,現在要你在矩陣中取一些數字,使得取得的數字和最大!

規則:相鄰的格仔不能同時取,即取了乙個以後,它四周的數字便不能再取了。

分析:(題目實際就是求乙個無向圖的最大點權獨立集)

這種方格的題目,我們最容易想到二分圖,最大流等等。事實上,也確實是用最大流來解二分圖。首先建圖:我們將行列相加為奇數的點與s相連,容量就為該點的點權,行列相加為偶數的點與t相連,容量同樣為該點的點權。然後,所有與s相連的點,將它與它四周連一條邊,容量為無窮大。對這樣的圖求一次最大流,最大流的值即該圖的最小點集覆蓋,我們最後用所有點權和減去最大流便是我們的答案了(最大點權獨立集=所有點權-最小點權覆蓋集)

圖是這樣建好了,可是我們會問,為什麼就要這樣建圖呢?為什麼某個點向它四周的點的邊容量就要是無窮大?

其實是這樣的:求完最大流以後,其實就形成了乙個最小割。最小割將圖分成了兩部分。而這個最小割的幾何意義是,完成一次取數方案的最小花費!

我們對殘留圖進行遍歷,對於左邊那些點,依然與s相連的點,說明它最終被取了,沒有相連的點,即被割了,說明它最終沒有被取。我們可以想象,如果某個與s相連的點的邊被割了,那麼它四周與t相連的那些點與t形成的邊便一定被保留了,也就是說想要保留某乙個,就必須割去這個點對應的另一邊,而最小割割的又恰好是較小的,於是較大的那乙個便得到了儲存。也可以理解為,割的那條邊便是花費,我花費叫小的錢,用來保留較大的點。再看,題目要求某乙個點不能與它四周的點同時被取,那麼我們就將他們連一條無窮大的邊,這樣的話,如果這條邊的兩點都要被取的話(乙個與s連,乙個與t連),我們就要付出無窮大的代價,這麼貴,當然不會取了。

再來看一題hdu 3657,這是2023年成都賽區網賽上的一道題

題意:還是給你乙個矩陣,矩陣上有一些數,依然是叫你取數,如果某兩個相鄰的數被你取了,那麼你取得的成績將會減去某乙個代價。也就是說,相鄰的點可以取了,只是要額外支付一些代價。並且,還會給你一些點,這些點必須要取到。問你最後取到的最大值。

分析:依然是二分圖的最小割,最後左邊與s相連的點說明最終被取到,右邊與t相連的點說明最終被取到了。我們先關注一下題目要求一定要取的點,怎麼保證最小割一定不會割這些點呢,你可能已經想到了,我們將它與相應的s或者t連無窮大的邊,那麼最小割就一定不敢割它了。好了,再來處理一下相鄰點的問題,上一題中,我們是要求不能取相鄰的點,所以我們將他們的邊值設為了無窮大,也就是要去他們兩個,就必須割斷這條邊,而割斷這條邊的話,付出無窮大的代價而已。現在題目要求不是不能取了,只是要付出一些代價,怎麼樣,想到了什麼?是不是將無窮大該成題目要求的代價就ok了?回答是對的!

現在我們建圖:

所有行列相加為偶數的點與s相連,所有行列相加為奇數的點與t相連,容量都為他們相應的點權。對於與s相連的所有點,他們向四周連一條代價為2*(x&y)的邊,x與y分別為連點的點權。好了,求最大流,最後輸出所有點權減去最大流值。

下面是第二題的**

#include#include#includeusing namespace std;

#define inf 0xfffffff

#define min(a,b) anext)

if(p->f && h[p->v]v];

} if(flow==left)

else

}return flow-left;

}int sap()}}

else

}} for(i=0;ielse

}cout<} return 0;

}

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...

mysql 索引深入理解 深入理解MySql的索引

為什麼索引能提高查詢速度 先從 mysql的基本儲存結構說起 mysql的基本儲存結構是頁 記錄都存在頁裡邊 各個資料頁可以組成乙個雙向鍊錶每個資料頁中的記錄又可以組成乙個單向鍊錶 每個資料頁都會為儲存在它裡邊兒的記錄生成乙個頁目錄,在通過主鍵查詢某條記錄的時候可以在頁目錄中使用二分法快速定位到對應...

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...