hdu5352城市重建 (km,最大流,費用流)

2021-08-04 05:10:53 字數 2053 閱讀 4663

題意:略

題解:一道將自己隱藏得很好的匹配問題,直接說建圖方法吧(按照網路流的方式敘述的,想寫km的可以自行轉換)

對於n座城市,每座城市都看做乙個點,並直接與源點相連,容量為1,對於操作1,將其看做乙個點,將此時在聯通

塊中的點均與其相連,容量為1,然後再將其與匯點相連,容量為k(km的話,這裡就需要加k個點了,所以跑得並沒有

網路流快)對於2,3操作,就是就按照它所說刪邊加邊就是了

因為要按字典序拍序,於是可以轉成費用流,越靠後的點費用越小(解釋得有點模糊,詳見**)

這裡只有費用流**,km又麻煩又慢,不想寫,費用流雖然看著有點長,但大多都是版

code:

#include#include#include#include#include#include#includeconst int inf=0x3f3f3f3f;

const int maxn=2000+5;

const int maxm=2000+5;

const int maxk=2000+5;

using namespace std;

struct nodeh[maxm*maxn];

int fir[maxn+maxm],cnt=1,ans,n,k;

bool inq[maxn+maxm],vis[maxn+maxm];

int dis[maxn],source,target,year;

queueq; int temp[maxn],acnt;

bool map[maxn][maxn],flag[maxn];

inline void addedge(int t1,int t2,int c,int cost)

void dfs(int s)

inline bool spfa()}}

if(dis[source]==dis[0]) return 0;

else return 1;

}int aug(int s,int augco)

int delta,augc=augco;

for(int i=fir[s];i&&augc>0;i=h[i].next)

}return augco-augc;

}int costflow()

return flow;

}inline void clear()

int t,m,opt,x,y,q;

int main()

break;}}

target=year+n+2; source=1;

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

addedge(i+n+1,target,k,0);

for(int i=1;i<=n;i++) addedge(1,i+1,1,0);

printf("%d\n",costflow());

for(int i=fir[target];i;i=h[i].next)

temp[++acnt]=h[i].c;

for(int i=acnt;i;i--)

if(i!=1) printf("%d ",temp[i]);

else printf("%d\n",temp[i]);

}}/*

n 1000

m 1000

k 1000

這道題呢,到是有點思路,最開始,先把輸入離線下來

然後看,對於1操作,將k個城市拆成k個點,將處於該聯通

塊內的每個城市都與這k個點相連,權值為這座城市出現的次數

至於加邊加點的操作,用矩陣應該比較方便吧,或者把所有

聯通塊都給存下來?

只是這個

建圖方法:

將源點與所有n座城市均連一條邊,容量為1,費用為0

對於每次1操作,將所有聯通塊內的節點與該年連邊,容量為1,

費用為之前進行了幾次1操作的數量取負,即越靠後的費用越小

最後,把所有年份與匯點連邊,容量為k,費用為0

15 6 2

2 1 2

2 1 3

1 11 2

3 1 1 2

1 2*/

KM演算法 PK 最小費用最大流

用到了km演算法 發現自己沒有這個模板,搜尋學習一下上海大學final大神,1 include 2 include 3 include 4 include 5 using namespace std 67 km演算法 8 複雜度o nx nx ny 9 求最大權匹配 10 若求最小權匹配,可將權值取...

hdu 4322 最大費用最大流)

思路 建圖真的是太巧妙了!直接copy大牛的了 由於只要得到糖就肯定有1個快樂度,在這一點上醣的效果是等效的。所以只要考慮有特殊效果的糖的分配就可以了。當快樂的程度超過b i 時,多出來的部分就浪費了,為了使浪費盡可能少,我們用費用流加以控制,當獲得最大費用最大流的時候,這是的費用的利用率就是最高的...

hdu 4322 Candy 最大費用最大流

很巧妙的建圖,沒有加成的糖對每個人都是一樣的所以建圖的時候只考慮加成的情況,以糖給人加的點數為費用,乙個人需要的點數為a則建一條由這個人指向匯的容量為a k費用為 k的邊,如果有餘數就再建一條容量為1費用為這個餘數的邊,由源向糖建邊,有加成效果的人和糖的組合之間連線,求這個圖的最小費用最大流即可。d...