题目链接: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 ;
}

最新文章

  1. CentOS6.3 重启后/etc/resolv.conf 被还原解决办法(转)
  2. shutdown命令用法
  3. Linux 进程与线程三(线程比较--创建线程参数)
  4. 张艾迪(创始人):世界级天才女孩Eidyzhang
  5. Objective-c 命名规则
  6. Android SDK中国在线更新镜像服务器 解决GOOGLE更新无法下载 更新失败的问题
  7. ApkTool动态打包
  8. JS中break continue和return的用法?
  9. 从Android Handler内部类到WeakReference的知识关联
  10. 使用 Node.js 做 Function Test
  11. jQuery给表单设置值
  12. a链接易混淆与form表单简易验证用法详解
  13. jquery 循环数组输出显示在html页面
  14. 使用 Angular CLI 和 Webpack 分析包尺寸
  15. vue.js - 奇怪的 event 对象
  16. Scala-Unit-2-Scala基础语法1
  17. [BZOJ 4671]异或图
  18. Unity使用协程技术制作倒计时器
  19. ORACLE学习笔记 translate,REGEXP_replace
  20. Servlet基础笔记

热门文章

  1. EL函数库
  2. Android 四大组件(Activity、Service、BroadCastReceiver、ContentProvider)
  3. angularjs-1
  4. fatfs文件系统f_lseek追加文件
  5. Atitit.404错误解决标准流程and url汉字中文路径404错误resin4 resin chinese char path 404 err解决
  6. Atitit.web预览播放视频的总结
  7. POJ - 3264 Balanced Lineup (RMQ问题求区间最值)
  8. 用广搜实现的spfa
  9. 关于mysqli_free_result($result)报错
  10. ashx上传姿势