【最大流】【费用流】bzoj1834 [ZJOI2010]network 网络扩容
引用题解:
#include<cstdio> #include<algorithm> #include<cstring> #include<queue> using namespace std; #define MAXN 1011 #define MAXM 25001 #define INF 2147483647 int S,T,n,m,A[5001],B[5001],W1,Goal; int en,u[MAXM],W2[5001],v[MAXM],first[MAXN],next[MAXM],cap[MAXM],cost[MAXM];//Next Array bool inq[MAXN]; int d[MAXN]/*spfa*/,p[MAXN]/*spfa*/,a[MAXN]/*可改进量*/; queue<int>q; void Init_MCMF(){memset(first,-1,sizeof(first));en=0;S=1;T=n;} void AddEdge(const int &U,const int &V,const int &W,const int &C) {u[en]=U; v[en]=V; cap[en]=W; cost[en]=C; next[en]=first[U]; first[U]=en++; u[en]=V; v[en]=U; cost[en]=-C; next[en]=first[V]; first[V]=en++;} bool Spfa(int &Flow,int &Cost) { memset(d,0x7f,sizeof(d)); memset(inq,0,sizeof(inq)); d[S]=0; inq[S]=1; p[S]=0; a[S]=INF; q.push(S); while(!q.empty()) { int U=q.front(); q.pop(); inq[U]=0; for(int i=first[U];i!=-1;i=next[i]) if(cap[i] && d[v[i]]>d[U]+cost[i]) { d[v[i]]=d[U]+cost[i]; p[v[i]]=i; a[v[i]]=min(a[U],cap[i]); if(!inq[v[i]]) {q.push(v[i]); inq[v[i]]=1;} } } if(d[T]>2100000000) return 0; Flow+=a[T]; Cost+=d[T]*a[T]; int U=T; while(U!=S) { cap[p[U]]-=a[T]; cap[p[U]^1]+=a[T]; U=u[p[U]]; } return 1; } int Flow,Cost; int Mincost() { Flow=0,Cost=0; while(Spfa(Flow,Cost)); } int main() { scanf("%d%d%d",&n,&m,&Goal); Init_MCMF(); for(int i=1;i<=m;++i) { scanf("%d%d%d%d",&A[i],&B[i],&W1,&W2[i]); AddEdge(A[i],B[i],W1,0); } Mincost(); printf("%d ",Flow); for(int i=1;i<=m;++i) AddEdge(A[i],B[i],INF,W2[i]); S=0; AddEdge(S,1,Goal,0); Mincost(); printf("%d\n",Cost); return 0; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。