hdu3157 有源匯上下界最小流

2021-06-27 13:42:16 字數 1184 閱讀 9254

/*

有源匯上下限最小流

(1)新增超級源點ss和超級匯點tt

(2)對於原有的邊(u,v,l(u,v),c(u,v))(l為流量下限,c為流量上限),新增邊(u,v,0,c-l);

(3)對於每個結點i,記w[i]=l(u,i)-l(i,v)=f(i,v)-f(u,i);出-入

若w[i]>0,新增邊(ss,i,w[i]),若w[i]<0,新增邊(i,tt,-w[i]);

(4)求解ss-tt的最大流,記為f1

(5)新增(t,s,inf),求ss-tt的最大流,記為f2

(6)如f1+f2==sum,則有最小流,則[t,s]的流量就是最小流,即edge[id^1].flow

*/#include #include#include using namespace std;

const int inf=0x3fff3ff;

const int maxn=1500;

struct edge

edge[maxn];

int head[maxn],cnt;

int pre[maxn];

int cur[maxn];

int gap[maxn];

int level[maxn];

int w[maxn];

int s,t,ss,tt,tot,sum;

inline void addedge(int u,int v,int flow)

void build_graph(int n,int m)

for(int i=1;i<=tot;i++)

if(w[i]>0)addedge(ss,i,w[i]);

else if(w[i]<0)addedge(i,tt,-w[i]),sum+=-w[i];

}int sap(int start,int end,int tot)//別打成s,t

ans+=inf;

inf=inf;

}break;

}} if(!flag)

level[u]=minn+1;

gap[minn+1]++;

if(u!=start)

u=pre[u];

} }return ans;

}int main()

return 0;

}

有源匯上下界最小流 模板

這只是 其中一種 做法 這只是其中一種做法 這只是其中一 種做法 我暫時還沒有理解,只是先放個模板而已 首 先還 是根據下 界來建圖 原圖源 點s,匯 點t 首先還是根據下界來建圖,原圖源點s,匯點t 首先還是根據 下界來建 圖,原圖 源點s,匯點t 然 後因 為流量守 恆,新建 超級源s 1和超級...

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 ...