hdu 4289 最大流拆點

2022-06-03 14:42:12 字數 1993 閱讀 3937

大致題意:

給出乙個又n個點,m條邊組成的無向圖。給出兩個點s,t。對於圖中的每個點,去掉這個點都需要一定的花費。求至少多少花費才能使得s和t之間不連通。

大致思路:

最基礎的拆點最大流,把每個點拆作兩個點 i 和 i' 連線i->i'費用為去掉這個點的花費,如果原圖中有一條邊a->b則連線a'->b。對這個圖求出最大流即可。

畫了個圖,仔細看看似乎是這麼回事

1

//10022/*

3hdu 4289

4g++ 62ms 1888k

5最大流

6sap7*/

8 #include9 #include10 #include11 #include

12 #include13 #include

14 #include15

using

namespace

std;

1617

const

int maxn=5000;//

點數的最大值

18const

int maxm=2500000;//

邊數的最大值

19const

int inf=0x3f3f3f3f;20

21struct

node

22edge[maxm];

26int

tol;

27int

head[maxn];

28int

dep[maxn];

29int gap[maxn];//

gap[x]=y:說明殘留網路中 dep[i]==x的個數為y

3031

int n;//

點的實際個數,一定是總的點的個數,包括源點和匯點

32void

init()

3337

void addedge(int u,int v,int

w)38

50void bfs(int start,int

end)

5173}74

}75int sap(int start,int

end)

7697

for(i=0;i)

98102 res+=temp;

103 top=inser;

104 u=edge[s[top]].from

;105

}106

if(u!=end&&gap[dep[u]-1]==0)//

出現斷層,無增廣路

107break

;108

for(i=cur[u];i!=-1;i=edge[i].next)

109if(edge[i].cap!=0&&dep[u]==dep[edge[i].to]+1

)110

break

;111

if(i!=-1

)112

117else

118128

}129 --gap[dep[u]];

130 dep[u]=min+1

;131 ++gap[dep[u]];

132if(u!=start)

133 u=edge[s[--top]].from

;134

}135

136}

137return

res;

138}

139140

intmain()

141161

while(m--)

162167 printf("

%d\n

",sap(start,end));

168}

169return0;

170 }

HDU 4289 Control(最大流 拆點)

題意 乙個無向圖,點帶權值,有源點s,匯點t,問最少拆出多少權值的點使st不連通 include s or t 可以轉化為最大流問題,將每個點p拆分成 p與p 使p p 邊權值賦為點權值,建邊 p,q 時只需連線 p q q p 邊權值為inf即可。跑最大流是sap 2 st,2 ed 1,2 n ...

hdu 4292 拆點 最大流)

思路 為了控制乙個人只連一瓶飲料,乙份食物,那麼我們可以把乙個人拆成兩個,他們之間連一條權值為1的邊,另外左邊連它喜歡的食物,權值為1,右邊連它喜歡的飲料,權值為1,在起點連食物的時候加流量限制,終點加流量限制,跑一遍最大流即可。1 include2 include3 include4 using ...

hdu 4292 拆點 最大流)

思路 為了控制乙個人只連一瓶飲料,乙份食物,那麼我們可以把乙個人拆成兩個,他們之間連一條權值為1的邊,另外左邊連它喜歡的食物,權值為1,右邊連它喜歡的飲料,權值為1,在起點連食物的時候加流量限制,終點加流量限制,跑一遍最大流即可。1 include2 include3 include4 using ...