hdu 3879 最大權閉包)

2021-06-22 05:40:42 字數 1504 閱讀 3989

選擇了一條邊就會選擇兩個點,邊的花費為正,點的花費為負,把邊看成點,這個點向兩個端點連一條邊,表示選擇這條邊就會選擇這兩個點

然後題目就相當於最大權閉合圖的模型了(最大權閉包模型中vs與正收益的點連邊,負收益的點與vt連邊,容量取絕對值,然後點與點之間連容量為inf的邊)

題意:有n個點,m個選擇,建造n個點各自需要一定花費,每個選擇有一定的獲利,會選擇兩個點,當然也要花費。求最大的獲利

每個選擇看成是獲利點,每個點看成是花費點,新建源點向獲利點建邊,權值為獲利的大小,花費點向匯點建邊,權值為花費的大小

每個選擇向相應的兩個點連一條容量為無窮大的邊,然後求網路的最小割答案就為正的權值和-最小割的容量

最小割肯定為簡單割(直接與源點或匯點相連),在這個題目中,如果與匯點相連的邊為割邊,表示這個點沒有被選擇來建station

如果與源點相連的邊為割邊,表示不選擇某個客戶的要求來連線某兩個station

所以可以理解成:最終收益= 所有可能收益-(損失的收益+架設費用)括號中的即為最小割所求

1 #include2 #include3 #include4

using

namespace

std;

5#define maxn 55555

6#define maxm 5555555

7#define inf 1<<30

8struct

edgeedge[maxm];

1112

inthead[maxn];

13int

pre[maxn];

14int

cur[maxn];

15int

level[maxn];

16int

gap[maxn];

17int

ne,nv,vs,vt,n,m;

1819

void insert(int u,int v,int cap,int cc=0)26

27int sap(int vs,int

vt)48 aug=-1;49

}50goto

loop;51}

52}53int minlevel=nv;

54for(int i=head[u];i!=-1;i=edge[i].next)60}

61if(--gap[level[u]]==0)break

;62 level[u]=minlevel+1

;63 gap[level[u]]++;

64 u=pre[u];65}

66return

maxflow;67}

6869

intmain()

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

85 printf("

%d\n

",sum-sap(vs,vt));86}

87return0;

88 }

hdu4971 流 最大權閉包

題意 給了一些任務,然後給了一些完成某些任務的限制,然後又給了限制之間的拓撲關係,最後問你最大收益。思路 很直白,就是流的乙個應用,最大權閉包,沒涉及到什麼想法的地方,建圖也不坑,直接說建圖吧,s 所有任務 流量是 任務價值 所有限制 t 流量是 限制代價 a b 流量 inf a限制的拓撲關係在b...

hdu3879 網路流(經典最大獲利問題)

這題建圖自己想了半天搞不懂,然後看了一下別人的建圖。一臉茫然。最後去看了下胡波濤的 最小割模型在資訊學競賽的應用 裡面詳細的講解了將最大獲利問題轉換為最小割模型的過程。建圖 源點與人連邊,容量為獲利。站點與匯點連邊,容量為耗資。然後是相應的人與其需求的站點連邊,容量為無窮。這樣建圖就完成了,然後就是...

hdu3879及ISAP模板(鏈式前向星)

題意不多說了,解題思路詳見胡波濤的 最小割模型在資訊學競賽的應用 複習了一下鏈式前向星,雖然都是isap,但是寫起來還是有許多要注意的地方。詳細見 include include include include include define rep i,a,b for int i a i b 1 i...