CSU 1506(最小费用最大流)
2024-08-25 07:28:44
题意:有两个人;给出路径之间第一个人走所需要的费用和第二个人走所需要的费用(在第一个人所需的 费用上再加上第二次的费用);求两个人一共所需要的最小费用。
分析:建立超源和超汇,流量分别为2,从源点到汇点的最大流2时最小费用为答案。
#include <cstdio>
#include <cstring>
#include <string>
#include <queue>
#include <cmath>
#include <algorithm>
#define LL long long
using namespace std;
//点的总数为 N,点的编号 1~N
const int MAXN = ;
const int MAXM = ;
const int INF = 0x3f3f3f3f;
struct edge
{
int to,cap,flow,cost,next;
edge(){}
edge(int to,int cap,int flow,int cost,int next):to(to),cap(cap),flow(flow),cost(cost),next(next){}
}e[MAXM];
int head[MAXN],tot;
int pre[MAXN],dis[MAXN];
bool vis[MAXN];
int N,M;
void init(int n)
{
N=n;
tot=;
memset(head,-,sizeof(head));
}
void addedge(int u, int v, int cap, int flow, int cost)
{
e[tot]=edge(v,cap,flow,cost,head[u]);
head[u]=tot++;
e[tot]=edge(u,,,-cost,head[v]);
head[v]=tot++;
}
bool spfa(int s,int t)
{
queue<int>q;
for(int i=;i<N;i++)
{
dis[i]=INF;
vis[i]=false;
pre[i]=-;
}
dis[s]=;
vis[s]=true;
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=false;
for(int i=head[u];~i;i=e[i].next)
{
int v=e[i].to;
if(e[i].cap>e[i].flow&&dis[v]>dis[u]+e[i].cost)
{
dis[v]=dis[u]+e[i].cost;
pre[v]=i;
if(!vis[v])
{
vis[v]=true;
q.push(v);
}
}
}
}
if(pre[t]==-) return false;
else return true;
}
//返回的是最大流, cost存的是最小费用
int minCostMaxflow(int s,int t,int &cost)
{
int flow=;
cost=;
while(spfa(s,t))
{
int Min=INF;
for(int i=pre[t];i!=-;i=pre[e[i^].to])
{
if(Min>e[i].cap-e[i].flow)
Min=e[i].cap-e[i].flow;
}
for(int i=pre[t];i!=-;i=pre[e[i^].to])
{
e[i].flow+=Min;
e[i^].flow-=Min;
cost+=e[i].cost*Min;
}
flow+=Min;
}
return flow;
}
int main()
{
int n,m;
int cas=;
while(scanf("%d%d",&n,&m)>)
{
init(n+);
for(int i=;i<m;i++)
{
int u,v,w1,w2;
scanf("%d%d%d%d",&u,&v,&w1,&w2);
addedge(u,v,,,w1);
addedge(u,v,,,w1+w2);
}
addedge(,,,,);
addedge(n,n+,,,);
int ans=;
minCostMaxflow(,n+,ans);
printf("Case %d: %d\n",cas++,ans);
}
return ;
}
最新文章
- 结巴分词3--基于汉字成词能力的HMM模型识别未登录词
- javascript技术大全
- Java for LeetCode 068 Text Justification
- Volatile vs VolatileRead/Write?
- erl0007 - erlang 远程节点连接的两种方式
- PHP 判断客户端请求是 Android 还是 IOS
- 启动Selenium RC —— 我的第一个shell
- 杂题 SPOJ MOBILE2 - Mobiles
- SQLServer优化资料整理(一)
- MEMS陀螺仪—MEMS产品中的杀手
- 自定义MVC框架(二) -基于XML文件
- 解析新浪微博表情包的一套js代码
- chrome调试工具高级不完整使用指南(实战二)
- 给dataframe添加一列索引
- Oracle中和mysql中函数的区别
- day4_局部变量和全局变量
- .Net MVC个人笔记
- mysql binglog server的设置方法【原创】
- it工程师常用英文自我介绍常用用语
- Java并发编程-闭锁
热门文章
- C#Windows的HelloWorld
- Eclipse用法和技巧二十二:快速调整字体大小
- 复合文档的二进制存储格式研究[ole存储结构](word,xls,ppt...)[转]
- Delphi高仿Windows扫雷游戏(全部都是贴图绘制)
- 基于visual Studio2013解决C语言竞赛题之1047百马问题
- 强大的Http监控工具Fidder
- Spring通过工厂创建实例的注意事项
- 删除workspace下的vss的scc文件
- node-inspector使用
- golang各版本的变化