日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【模板】最大权闭合图

發(fā)布時(shí)間:2023/12/3 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【模板】最大权闭合图 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

ACM模板


目錄

      • 概念
      • 建圖
      • 證明
      • 模板題

概念

閉合圖中所有的點(diǎn)的出邊必須指向內(nèi)部的點(diǎn)

建圖

原圖的邊在網(wǎng)絡(luò)流中的邊容量是INF,如果點(diǎn)權(quán)是正,那么源點(diǎn)向其連邊,容量是點(diǎn)權(quán);否則它向匯點(diǎn)連邊,容量是點(diǎn)權(quán)絕對值

證明

考慮最小割 [S,T][S,T][S,T],所求的滿足條件的閉合子圖為V1V_1V1?

S=V1∪{s}S=V_1\cup \{ s \}S=V1?{s}T=V2∪{t}T=V_2\cup \{t \}T=V2?{t},其中V2=V?V1V_2=V-V_1V2?=V?V1?
c[S,T]=∑v∈V2+wv+∑v∈V1?(?wv)c[S,T]=\sum_{v\in V_2^+}w_v+\sum_{v\in V_1^-}(-w_v)c[S,T]=vV2+??wv?+vV1???(?wv?)

而閉合子圖的權(quán)值為
W(V1)=∑v∈V1+wv+∑v∈V1?wv=∑v∈V1+wv?∑v∈V1?(?wv)W(V_1)=\sum_{v\in V_1^+}w_v+\sum_{v\in V_1^-}w_v=\sum_{v\in V_1^+}w_v-\sum_{v\in V_1^-}(-w_v)W(V1?)=vV1+??wv?+vV1???wv?=vV1+??wv??vV1???(?wv?)

于是有
c[S,T]+W(V1)=∑v∈V1+wv+∑v∈V2+wv=∑v∈V+wvc[S,T]+W(V_1)=\sum_{v\in V_1^+}w_v+\sum_{v\in V_2^+}w_v=\sum_{v\in V^+}w_vc[S,T]+W(V1?)=vV1+??wv?+vV2+??wv?=vV+?wv?


W(V1)=∑v∈V+wv?c[S,T]W(V_1)=\sum_{v\in V^+}w_v-c[S,T]W(V1?)=vV+?wv??c[S,T]

模板題

最大獲利

#include<iostream> #include<algorithm> #include<cstring> using namespace std; const int N=55010,M=6*N,INF=0x3f3f3f3f; int n,m; int h[N],e[M],ne[M],f[M],idx; int S,T,d[N],q[N],cur[N]; void add(int a,int b,int c) {e[idx]=b,ne[idx]=h[a],f[idx]=c,h[a]=idx++;e[idx]=a,ne[idx]=h[b],f[idx]=0,h[b]=idx++; } bool bfs() {memset(d,-1,sizeof d);int tt=0,hh=0;q[S]=0,cur[S]=h[S],d[S]=0;while(hh<=tt){int t=q[hh++];for(int i=h[t];i!=-1;i=ne[i]){int j=e[i];if(d[j]==-1&&f[i]){d[j]=d[t]+1;cur[j]=h[j];if(j==T) return 1;q[++tt]=j;}}}return 0; } int dfs(int u=S,int flow=INF) {if(u==T) return flow;int rmn=flow;for(int i=cur[u];i!=-1&&rmn;i=ne[i]){cur[u]=i;int j=e[i];if(d[j]==d[u]+1&&f[i]){int t=dfs(j,min(f[i],rmn));if(!t) d[j]=-1;f[i]-=t,f[i^1]+=t,rmn-=t;}}return flow-rmn; } int dinic() {int r=0;while(bfs()) r+=dfs();return r; } int main() {cin>>n>>m;memset(h,-1,sizeof h);S=0,T=n+m+1;int s=0;for(int i=1;i<=n;i++){int p;cin>>p; add(i,T,p);}for(int i=1;i<=m;i++){int a,b,c;cin>>a>>b>>c;add(i+n,a,INF),add(i+n,b,INF);add(S,i+n,c);s+=c;}cout<<s-dinic()<<'\n';return 0; } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的【模板】最大权闭合图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。