1. 程式人生 > >【網路流】最小費用最大流(模板)

【網路流】最小費用最大流(模板)

#include <bits/stdc++.h>
using namespace std;

const int Max=50010;
const int inf=1e9;
int n,m,ans1,ans2,size=1,head,tail,s,t;
int first[Max],dis[Max],p[Max],exist[Max],vis[Max],temp[Max];
struct shu{int to,next,len,val;};
shu bian[Max*2];

inline int get_int()
{
   int x=0,f=1;
   char c;
   for(c=getchar();(!isdigit(c))&&(c!='-');c=getchar());
   if(c=='-') {f=-1;c=getchar();}
   for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';
   return x*f;
}

inline void build(int x,int y,int z,int w)
{
   bian[++size].next=first[x];first[x]=size;bian[size].to=y;bian[size].len=z;bian[size].val=w;
}

inline int spfa()
{
   for(int i=1;i<=tail;i++) p[i]=0;
   for(int i=1;i<=n;i++) {dis[i]=inf;exist[i]=0;}
   head=0,tail=1;dis[s]=0;p[1]=s;
   while(head<=tail)
   {
     int point=p[++head];
     exist[point]=0;
     for(int u=first[point];u;u=bian[u].next)
     {
       if(bian[u].len > 0 && dis[point]+bian[u].val < dis[bian[u].to])
       {
       	 dis[bian[u].to]=dis[point]+bian[u].val;
       	 //pre[bian[u].to]=u;
       	 if(!exist[bian[u].to])
       	 {
       	   exist[bian[u].to]=1;
       	   p[++tail]=bian[u].to;
       	 }
       }
     }
   }
   if(dis[t] == inf) return 0;
   else return 1;
}

inline int dfs(int point,int flow)
{
   if(point == t) return flow;
   vis[point]=1;
   int sum=0;
   for(int &u=temp[point];u;u=bian[u].next)
   	 if(!vis[bian[u].to] && dis[bian[u].to] == dis[point] + bian[u].val && bian[u].len > 0)
   	 {
   	   int minn=dfs(bian[u].to,min(flow-sum,bian[u].len));
       ans2+=minn*bian[u].val;
   	   bian[u].len-=minn;
   	   bian[u^1].len+=minn;
   	   sum+=minn;
       if(flow-sum == 0) break;
     }
   vis[point]=0;
   return sum;
}

int main()
{
   freopen("lx.in","r",stdin);
   n=get_int();
   m=get_int();
   s=1;t=n;
   for(int i=1;i<=m;i++)
   {
   	 int x=get_int(),y=get_int(),z=get_int(),w=get_int();
   	 build(x,y,z,w);
   	 build(y,x,0,-w);
   }
   while(spfa())
   {
     memcpy(temp,first,sizeof(first));
     int x=dfs(s,inf);
     while(x)ans1+=x,x=dfs(s,inf);
   }

   cout<<ans1<<" "<<ans2<<"\n";
   return 0;
}

相關推薦

網路24題餐巾計劃費用

題意 一個餐廳在相繼的 nnn 天裡,每天需用的餐巾數不盡相同。假設第 iii 天需要 rir_iri​​​ 塊餐巾。餐廳可以購買新的餐巾,每塊餐巾的費用為 PPP 分;或者把舊餐巾送到快洗部,洗一塊需 MMM天,其費用為 FFF 分;或者送到慢洗部,洗一塊需

網路24題運輸問題費用

題意 W 公司有 mmm 個倉庫和 nnn 個零售商店。第 iii 個倉庫有 aia_iai​​​ 個單位的貨物;第 jjj 個零售商店需要 bjb_jbj​​​ 個單位的貨物。貨物供需平衡,即∑i=1mai=∑j=1nbj​​\sum\limits_{i =

網路24題 No.10 餐巾計劃問題 線性規劃網路優化 費用

【題意】   一個餐廳在相繼的 N 天裡, 每天需用的餐巾數不盡相同。 假設第 i 天需要 ri 塊餐巾(i=1,2,…, N)。 餐廳可以購買新的餐巾,每塊餐巾的費用為 p 分;或者把舊餐巾送到快洗部,洗一塊需 m 天,其費用為 f分;或者送到慢洗部, 洗一塊需 n 天(n>m),其費用為 s<

洛谷4016 負載平衡問題網路24題,費用

前言 網路流24題還是要寫一下。 Solution 我們先來研究一下這個題目是個什麼東西: 每一個點有可能比平均數多,也有可能少,然後你就發現相當於是我們建了兩個超級源點和超級匯點,然後從這兩個點去分和流入。 然後對於這個環就可以直接建環(注意建邊的時候的一些細節操作) 跑一邊費用流就好了。 #inc

網路費用模板

#include <bits/stdc++.h> using namespace std; const int Max=50010; const int inf=1e9; int n,m,ans1,ans2,size=1,head,tail,s,t; int f

2017 ACM-ICPC 亞洲區烏魯木齊賽區網路賽 J.Our Journey of Dalian Ends費用

Life is a journey, and the road we travel has twists and turns, which sometimes lead us to unexpected places and unexpected people. Now our journey of Dal

[洛谷3381]模板費用

main 最小費用最大流 spf 最大流模板題 rem digi span mem spfa 思路:最小費用最大流模板題。用EdmondsKarp,增廣時使用SPFA求最短路。 1 #include<queue> 2 #include<cstd

[洛谷P3381]模板費用

code main sdi span printf fast tdi nbsp optimize 題目大意:給出一個網絡圖,以及其源點和匯點,每條邊已知其最大流量和單位流量費用,求出其網絡最大流和在最大流情況下的最小費用。 解題思路:最小費用最大流模板。雖說此題最後兩個點

P3381 模板費用

false == blog content space cost pre png 單位 P3381 【模板】最小費用最大流 題目描述 如題,給出一個網絡圖,以及其源點和匯點,每條邊已知其最大流量和單位流量費用,求出其網絡最大流和在最大流情

luogo_3381模板費用

int names push its als llc eof cap pty #include<bits/stdc++.h>using namespace std;#define MAXM 500010#define MAXN 5010#define INF 1

模板費用

tar getchar print lin problem ron n) std mon https://www.luogu.org/problemnew/show/3381 #include <iostream> #include <cstdio

luogu3381 模板費用

%d cstring void out mar -m body tmp using 每次選代價最小的流增廣 #include <iostream> #include <cstring> #include <cstdio> #include

網絡24題餐巾計劃問題費用

open pre ++i 需求 http += cst efi pty 【網絡流24題】餐巾計劃問題(最小費用最大流) 題面 COGS 洛谷上的數據範圍更大,而且要開longlong 題解 餐巾的來源分為兩種: ①新買的 ②舊的拿去洗 所以,兩種情況分別建圖 先考慮第一種

bzoj 1927 [Sdoi2010]星際競速費用

流量 source 覆蓋 tdi png code struct || 就是 果然還是不會建圖… 設\( i \)到\( j \)有通路,代價為\( w[i][j] \),瞬移到i代價為\( a[i] \),瞬移到i代價為\( a[j] \),逗號前是流量。 因為每個點只

洛谷 P4015 運輸問題 費用+費用

div add cst push sin eof namespace get main s向倉庫i連ins(s,i,a[i],0),商店向t連ins(i+m,t,b[i],0),商店和倉庫之間連ins(i,j+m,inf,c[i][j])。建兩次圖分別跑最小費用最大流和最大

洛谷 P4014 分配問題 費用+費用

pre clas memset namespace ins include i++ oid 的人 其實KM更快……但是這道題不卡,所以用了簡單粗暴的費用流,建圖非常簡單,s向所有人連流量為1費用為0的邊來限制流量,所有工作向t連流量為1費用為0的邊,然後對應的人和工作連(i

bzoj 1834: [ZJOI2010]network 網絡擴容+費用

mark 建圖 network 最小 bfs source include tdi down 第一問直接跑最大流即可。建圖的時候按照費用流建,費用為0. 對於第二問,在第一問dinic剩下的殘量網絡上建圖,對原圖的每條邊(i,j),建(i,j,inf,cij),表示可以用c

洛谷P3381 模板費用(dijstra費用)

就是 tro fin https copy priority 而不是 ++ printf 題目描述 如題,給出一個網絡圖,以及其源點和匯點,每條邊已知其最大流量和單位流量費用,求出其網絡最大流和在最大流情況下的最小費用。 輸入輸出格式 輸入格式: 第一行包含四

luogu P3381 費用 模板

pty pre const truct str next eof OS return 題目鏈接:https://www.luogu.org/problemnew/show/P3381 把bfs變成spfa 1 #include <cstdio> 2

Luogu--3381 模板費用

題目連結 3381 【模板】最小費用最大流 dijkstra 可能因為常數比較大 t了一個點但是 開o2之後可以輕鬆水過   dijkstra 版本 #include<bits/stdc++.h> using namespace std; #define ma