選擇了一條邊就會選擇兩個點,邊的花費為正,點的花費為負,把邊看成點,這個點向兩個端點連一條邊,表示選擇這條邊就會選擇這兩個點
然後題目就相當於最大權閉合圖的模型了(最大權閉包模型中vs與正收益的點連邊,負收益的點與vt連邊,容量取絕對值,然後點與點之間連容量為inf的邊)
題意:有n個點,m個選擇,建造n個點各自需要一定花費,每個選擇有一定的獲利,會選擇兩個點,當然也要花費。求最大的獲利
每個選擇看成是獲利點,每個點看成是花費點,新建源點向獲利點建邊,權值為獲利的大小,花費點向匯點建邊,權值為花費的大小
每個選擇向相應的兩個點連一條容量為無窮大的邊,然後求網路的最小割答案就為正的權值和-最小割的容量
最小割肯定為簡單割(直接與源點或匯點相連),在這個題目中,如果與匯點相連的邊為割邊,表示這個點沒有被選擇來建station
如果與源點相連的邊為割邊,表示不選擇某個客戶的要求來連線某兩個station
所以可以理解成:最終收益= 所有可能收益-(損失的收益+架設費用)括號中的即為最小割所求
1 #include2 #include3 #include4using
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...