传送门:Double Shortest Paths

题意:有两个人;给出路径之间第一个人走所需要的费用和第二个人走所需要的费用(在第一个人所需的 费用上再加上第二次的费用);求两个人一共所需要的最小费用。

分析:建立超源和超汇,流量分别为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 ;
}

最新文章

  1. 结巴分词3--基于汉字成词能力的HMM模型识别未登录词
  2. javascript技术大全
  3. Java for LeetCode 068 Text Justification
  4. Volatile vs VolatileRead/Write?
  5. erl0007 - erlang 远程节点连接的两种方式
  6. PHP 判断客户端请求是 Android 还是 IOS
  7. 启动Selenium RC —— 我的第一个shell
  8. 杂题 SPOJ MOBILE2 - Mobiles
  9. SQLServer优化资料整理(一)
  10. MEMS陀螺仪—MEMS产品中的杀手
  11. 自定义MVC框架(二) -基于XML文件
  12. 解析新浪微博表情包的一套js代码
  13. chrome调试工具高级不完整使用指南(实战二)
  14. 给dataframe添加一列索引
  15. Oracle中和mysql中函数的区别
  16. day4_局部变量和全局变量
  17. .Net MVC个人笔记
  18. mysql binglog server的设置方法【原创】
  19. it工程师常用英文自我介绍常用用语
  20. Java并发编程-闭锁

热门文章

  1. C#Windows的HelloWorld
  2. Eclipse用法和技巧二十二:快速调整字体大小
  3. 复合文档的二进制存储格式研究[ole存储结构](word,xls,ppt...)[转]
  4. Delphi高仿Windows扫雷游戏(全部都是贴图绘制)
  5. 基于visual Studio2013解决C语言竞赛题之1047百马问题
  6. 强大的Http监控工具Fidder
  7. Spring通过工厂创建实例的注意事项
  8. 删除workspace下的vss的scc文件
  9. node-inspector使用
  10. golang各版本的变化