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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

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

编程问答

网络流24题 ——运输问题 luogu 4015

發(fā)布時(shí)間:2024/8/24 编程问答 43 如意码农
生活随笔 收集整理的這篇文章主要介紹了 网络流24题 ——运输问题 luogu 4015 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目描述:這里

題面已經(jīng)提示我們這是費(fèi)用流了

那么由源點(diǎn)向所有倉(cāng)庫(kù)連邊,容量為倉(cāng)庫(kù)原有貨物量,費(fèi)用為0

然后由所有零售商店向匯點(diǎn)連邊,容量為一個(gè)零售商店的需求量,費(fèi)用為0

最后由倉(cāng)庫(kù)向零售商店連邊,容量正無(wú)窮(由于源點(diǎn)和匯點(diǎn)的限制,所以不會(huì)出現(xiàn)不合法情況),費(fèi)用為題給費(fèi)用

然后跑費(fèi)用流就得到了最小費(fèi)用

至于最大費(fèi)用,按套路所有費(fèi)用取反后再跑一遍費(fèi)用流即可

#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
const int inf=0x3f3f3f3f;
struct Edge
{
int next;
int to;
int val;
int pri;
}edge[40005];
int head[255];
int dis[255];
int pre[255];
int fa[255];
bool used[255];
int lim[255];
int v1[255];
int v2[255][255];
int cnt=1;
int st,ed;
int n,m;
void init()
{
memset(head,-1,sizeof(head));
memset(edge,0,sizeof(edge));
cnt=1;
}
void add(int l,int r,int w,int v)
{
edge[cnt].next=head[l];
edge[cnt].to=r;
edge[cnt].val=w;
edge[cnt].pri=v;
head[l]=cnt++;
}
int ide(int x)
{
return (x&1)?x+1:x-1;
}
bool spfa()
{
memset(dis,0x3f,sizeof(dis));
memset(used,0,sizeof(used));
memset(lim,0,sizeof(lim));
dis[st]=0;
pre[ed]=-1;
lim[st]=inf;
used[st]=1;
queue <int> M;
M.push(st);
while(!M.empty())
{
int u=M.front();
M.pop();
for(int i=head[u];i!=-1;i=edge[i].next)
{
int to=edge[i].to;
if(edge[i].val&&dis[to]>dis[u]+edge[i].pri)
{
lim[to]=min(lim[u],edge[i].val);
dis[to]=dis[u]+edge[i].pri;
pre[to]=i,fa[to]=u;
if(!used[to])used[to]=1,M.push(to);
}
}
used[u]=0;
}
return pre[ed]!=-1;
}
int EK()
{
int maxw=0,minv=0;
while(spfa())
{
maxw+=lim[ed];
minv+=lim[ed]*dis[ed];
int temp=ed;
while(temp!=st)
{
edge[pre[temp]].val-=lim[ed];
edge[ide(pre[temp])].val+=lim[ed];
temp=fa[temp];
}
}
return minv;
}
int main()
{
init();
scanf("%d%d",&n,&m);
st=m+n+1,ed=m+n+2;
for(int i=1;i<=n;i++)
{
scanf("%d",&v1[i]);
add(st,i,v1[i],0);
add(i,st,0,0);
}
for(int i=1;i<=m;i++)
{
scanf("%d",&v1[i+n]);
add(i+n,ed,v1[i+n],0);
add(ed,i+n,0,0);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&v2[i][j+n]);
add(i,j+n,inf,v2[i][j+n]);
add(j+n,i,0,-v2[i][j+n]);
}
}
printf("%d\n",EK());
init();
for(int i=1;i<=n;i++)
{
add(st,i,v1[i],0);
add(i,st,0,0);
}
for(int i=1;i<=m;i++)
{
add(i+n,ed,v1[i+n],0);
add(ed,i+n,0,0);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
add(i,j+n,inf,-v2[i][j+n]);
add(j+n,i,0,v2[i][j+n]);
}
}
printf("%d\n",-EK());
return 0;
}

  

總結(jié)

以上是生活随笔為你收集整理的网络流24题 ——运输问题 luogu 4015的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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