我們看到有源點和匯點的上下界最小流,即在可行流的基礎上要求流量最小。我們先跑一遍可行流,設可行流為flow1flow1flow1
則最小流為可行流−-−還能向下浮動的流量flow2flow2flow2
其實我們可以發現還能向下浮動的流量就是從原圖匯點到原圖源點的最大流(感性理解)。
因此步驟為:
跑出乙個有源匯上下界可行流,如果滿流則設其答案為flow1flow1flow1,否則不存在答案。
刪去從原圖匯點到原圖源點的邊。
跑從原圖匯點到原圖源點的最大流,設答案為flow2flow2flow2,則總答案ans=flow1−flow2ans=flow1-flow2ans=flow1−flow2。
#includeusing namespace std;
#define ll long long
const ll maxn =59905;
const ll inf=1e18;
ll head[maxn],cnt;
struct e
e[maxn*50];
ll nex[maxn],dis[maxn];
void add(ll u,ll v,ll flow)
ll n,m,st,ed,d[maxn],num=0;
void init()
queueq;
bool bfs()
} }return 0;
}ll dfs(ll u,ll w)
} return y;
}ll slove()
return ans;
}int main()
num=0;
for(ll i=1;i<=n;i++)
add(t1,s1,inf);
ll ans=slove();
//printf("ans=%lld\n",ans);
if(ans!=num)
cnt--;
st=t1,ed=s1;
ans=e[cnt].flow;
//printf("ans=%lld\n",ans);
e[cnt].flow=e[cnt^1].flow=0;
ans-=slove();
printf("%lld\n",ans);
return 0;
}
有源匯有上下界的最小流(LOJ117)
其實最小流和最大流個人感覺很類似,連線了超級源點和超級匯點之後跑完一次最大流,乙個是再在除去超級源點和超級匯點跑一次最大流,乙個是給源匯點連乙個無限邊求最大流,然後無限邊的流量就是答案 因為乙個相當於是要把殘量網路剩下的流加起來,才是最大流,而這個跑過最大流後剩下的就是最小流了 好像是有點點問題的,...
117 有源匯有上下界最小流
題目描述 n nn 個點,m mm 條邊,每條邊 e ee 有乙個流量下界 lower e text e lower e 和流量上界 upper e text e upper e 給定源點 s ss 與匯點 t tt,求源點到匯點的最小流。輸入格式 第一行兩個正整數 n nn m mm s ss t...
有源匯有上下界最大 最小流
建圖還是要想一想的.寫一下吧 首先根據有源匯可行流建圖,正向附加邊滿流證明有可行流 然後在這個殘量網路上刪掉 t,s,oo 這條邊,跑 s t 最大流就是最大流,t s 最大流就是最小流 include define int long long define ll long long define ...