zoj 3362(最大费用)
2024-08-29 04:49:29
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3904
思路:费用流的题,增加一个超级源点和一个超级汇点,然后就是连边了,对于每个城市,与汇点连边,容量为inf,花费(这里指收益)为商品在该城市的价值,然后对于图中给定的边,容量为cap,花费为-cost(负数代表花费),最后就是源点与城市1连边了,然后就是跑费用流了,求最大收益(当dist[vt]<0时直接退出)。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define MAXN 222
#define inf 1<<30 struct Edge{
int v,cap,cost,next;
}edge[MAXN*MAXN]; int n,m,vs,vt,NE;
int head[MAXN]; void Insert(int u,int v,int cap,int cost)
{
edge[NE].v=v;
edge[NE].cap=cap;
edge[NE].cost=cost;
edge[NE].next=head[u];
head[u]=NE++; edge[NE].v=u;
edge[NE].cap=;
edge[NE].cost=-cost;
edge[NE].next=head[v];
head[v]=NE++;
} bool mark[MAXN];
int dist[MAXN],pre[MAXN],cur[MAXN];
bool spfa(int vs,int vt)
{
memset(mark,false,sizeof(mark));
fill(dist,dist+MAXN,-inf);
dist[vs]=;
queue<int>que;
que.push(vs);
while(!que.empty()){
int u=que.front();
que.pop();
mark[u]=false;
for(int i=head[u];i!=-;i=edge[i].next){
int v=edge[i].v,cost=edge[i].cost;
if(edge[i].cap>&&dist[u]+cost>dist[v]){
dist[v]=dist[u]+cost;
pre[v]=u;
cur[v]=i;
if(!mark[v]){
mark[v]=true;
que.push(v);
}
}
}
}
return dist[vt]>;
} int MinCostFlow(int vs,int vt)
{
int flow=,cost=;
while(spfa(vs,vt)){
int aug=inf;
for(int u=vt;u!=vs;u=pre[u]){
aug=min(aug,edge[cur[u]].cap);
}
flow+=aug,cost+=aug*dist[vt];
for(int u=vt;u!=vs;u=pre[u]){
edge[cur[u]].cap-=aug;
edge[cur[u]^].cap+=aug;
}
}
return cost;
} int main()
{
int x,u,v,cap,cost;
while(~scanf("%d%d",&n,&m)){
vs=,vt=n+;
NE=;
memset(head,-,sizeof(head));
for(int i=;i<=n;i++){
scanf("%d",&x);
Insert(i,vt,inf,x);
}
while(m--){
scanf("%d%d%d%d",&u,&v,&cap,&cost);
Insert(u,v,cap,-cost);
Insert(v,u,cap,-cost);
}
Insert(vs,,inf,);
printf("%d\n",MinCostFlow(vs,vt));
}
return ;
}
最新文章
- CentOS6.3 重启后/etc/resolv.conf 被还原解决办法(转)
- shutdown命令用法
- Linux 进程与线程三(线程比较--创建线程参数)
- 张艾迪(创始人):世界级天才女孩Eidyzhang
- Objective-c 命名规则
- Android SDK中国在线更新镜像服务器 解决GOOGLE更新无法下载 更新失败的问题
- ApkTool动态打包
- JS中break continue和return的用法?
- 从Android Handler内部类到WeakReference的知识关联
- 使用 Node.js 做 Function Test
- jQuery给表单设置值
- a链接易混淆与form表单简易验证用法详解
- jquery 循环数组输出显示在html页面
- 使用 Angular CLI 和 Webpack 分析包尺寸
- vue.js - 奇怪的 event 对象
- Scala-Unit-2-Scala基础语法1
- [BZOJ 4671]异或图
- Unity使用协程技术制作倒计时器
- ORACLE学习笔记 translate,REGEXP_replace
- Servlet基础笔记
热门文章
- EL函数库
- Android 四大组件(Activity、Service、BroadCastReceiver、ContentProvider)
- angularjs-1
- fatfs文件系统f_lseek追加文件
- Atitit.404错误解决标准流程and url汉字中文路径404错误resin4 resin chinese char path 404 err解决
- Atitit.web预览播放视频的总结
- POJ - 3264 Balanced Lineup (RMQ问题求区间最值)
- 用广搜实现的spfa
- 关于mysqli_free_result($result)报错
- ashx上传姿势