大致題意:
給出乙個又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 ...