BZOJ1497 NOI2006 最大獲利

2021-07-15 22:07:11 字數 1082 閱讀 1872

什麼是最大權閉合子圖:

先解釋一下有向圖的閉合圖:閉合圖內任意點的任意後繼也一定還在閉合圖中。

物理意義:事物間依賴關係:乙個事件要發生,它需要的所有前提也都一定要發生。

最大權閉合圖:點權之和最大的閉合圖

最大權閉合圖構圖方法:

1.增加源s匯t 

2.源s連線原圖的正權點,容量為相應點權

3.原圖的負權點連線匯t,容量為相應點權的相反數

4.原圖邊的容量為正無限. 

最大權閉合圖 解決:

閉合圖v的權為正權點總和減去對應割的容量

當割最小時,閉合圖權最大

noi2006 最大獲利:

1.將原題中的邊和點都看成事件。

2.邊事件依賴邊的兩個端點事件的發生。這與閉合圖的性質相似。

3.構造性地,將邊轉化為點事件。

4.將所有邊都轉化為事件點,原圖便轉化為乙個二分圖。

5.解決該二分圖的最大權閉合圖即可

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

const int n=120005;

const int m=400005;

const int inf=2100000000;

int n,m,s,t;

int from[m],to[m],nxt[m],w[m],lj[n],cnt=-1;

void insert(int f,int t,int p)

int d[n],q[n*2];

bool bfs()

if(++h==n) h=0;

} if(d[t]) return true;

return false;

}int dfs(int x,int v)

return ret;

}int main()

int sum=0,ans=0;

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

while(bfs()) ans+=dfs(s,inf);

printf("%d",sum-ans);

}

bzoj 1497 NOI2006最大獲利

我對題意的理解 給出一堆公司和一堆使用者,我們買公司需要花錢,每個使用者會支付報酬當且僅當他所鍾愛的兩個公司我都買了,問最大獲利 最大權閉合子圖 好厲害的樣子 首先我們連邊最小割ans 答案就是sum ans 這個可以想,sum表示在不需要支出的情況下的獲利,現在我們需要支出,所以要跑一遍最小割。感...

bzoj1497 NOI2006 最大收益

最小割 思路比較簡單 點數看起來很多但是因為是類似二分圖的東西所以跑的比較快 源點對每個使用者連容量為收益的邊 使用者向中轉站連容量無窮大的邊 中轉站向匯點連容量為成本的邊 要麼割掉使用者帶來的收益 要麼割掉成本 include include include using namespace std...

BZOJ 1497 NOI2006 最大獲利

傳送門 經典的網路流 割邊表示捨棄該價值,所以可以把使用者群的收益連向一邊,建站的費用連向一邊,中間把對應點連inf 這樣的最小割就是最小捨棄的價值,加上總獲利就是最大獲利了 include include include define cint const int define inf 23333...