这题应该算是比较难的一道网络流的题,(但却在我校OJ考试上出现了),但是大家只要能理解此图的建边方式就行。

假设有5天的租车需求,虚拟出2*n+2 即 12个节点,0为源点,12为汇点。

1,源点到1 2 3 4 5流量为r[i],费用为0。6 7 8 9 10到汇点流量为r[i-n],费用为0。

此题为一个检验能否满流且求满流花费最小的问题。

2,虚拟第2n+1个节点为买车途径,源点到2n+1节点花费为p[i],流量为c[i],多重边。

3,对于每一个i+n节点,其来源有两个,一个是

2*n+1节点,即购买新车,一个是之前的车辆送去维修后的可用车辆。连接i和i+1节点,流量为INF,花费为0。

4,同时根据维修的天数

连接i和d[j]+i+1+n节点,花费为s[i],流量为INF。

做完连边之后就跑一趟最小费用最大流模板,如最大流等于每天需要的车辆和,输出最小费用,否则,输出impossible。

#include<bits/stdc++.h>
using namespace std;
bool vis[400001];
int n,m,s,t,x,y,z,f,dis[400001],pre[400001],last[400001],flow[400001],maxflow,mincost,hh,hhh,ss,c,r,a[400001],b[400001];
struct Edge{
int to,next,flow,dis;
}edge[400001];
int head[400001],cnt;
queue <int> q;
void add(int from,int to,int flow,int dis)
{
edge[cnt].next=head[from];
edge[cnt].to=to;
edge[cnt].flow=flow;
edge[cnt].dis=dis;
head[from]=cnt++;
}
bool spfa(int s,int t)
{
memset(dis,0x7f,sizeof(dis));
memset(flow,0x7f,sizeof(flow));
memset(vis,0,sizeof(vis));
q.push(s); vis[s]=1; dis[s]=0; pre[t]=-1;
while(!q.empty())
{
int now=q.front();
q.pop();
vis[now]=0;
for (int i=head[now]; i!=-1; i=edge[i].next)
{
if (edge[i].flow>0 && dis[edge[i].to]>dis[now]+edge[i].dis)
{
dis[edge[i].to]=dis[now]+edge[i].dis;
pre[edge[i].to]=now;
last[edge[i].to]=i;
flow[edge[i].to]=min(flow[now],edge[i].flow);
if (!vis[edge[i].to])
{
vis[edge[i].to]=1;
q.push(edge[i].to);
}
}
}
}
return pre[t]!=-1;
}
void MCMF()
{
while(spfa(s,t))
{
int now=t;
maxflow+=flow[t];
mincost+=flow[t]*dis[t];
while(now!=s)
{
edge[last[now]].flow-=flow[t];
edge[last[now]^1].flow+=flow[t];
now=pre[now];
}
}
}
int read()
{
char ch=getchar();
int num=0;
while(ch<'0'||ch>'9')
{
ch=getchar();
}
while(ch<='9'&&ch>='0')
{
num=num*10+ch-'0';
ch=getchar();
}
return num;
}
int main()
{
hh=read();
hhh=hh;
while(hh--)
{
maxflow=0;
mincost=0;
printf("Case %d: ",hhh-hh);
ss=0;
cnt=0;
memset(head,-1,sizeof(head));
n=read();
c=read();
r=read();
t=2*n+1;
s=0;
for(int i=1;i<=n;i++)
{
if(i!=n)
{
add(i,i+1,99999999,0);
add(i+1,i,0,0);
}
}
for(int i=1;i<=n;i++)
{
x=read();
add(i,t,x,0);
add(t,i,0,0);
add(s,i+n,x,0);
add(i+n,s,0,0);
ss+=x;
}
for(int i=1;i<=c;i++)
{
x=read();
y=read();
add(s,1,x,y);
add(1,s,0,-y);
}
for(int i=1;i<=r;i++)
{
a[i]=read();
b[i]=read();
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=r;j++)
{
if(i+a[j]+1<=n)
{
add(n+i,i+a[j]+1,99999999,b[j]);
add(i+a[j]+1,n+i,0,-b[j]);
}
}
}
MCMF();
if(maxflow==ss)
{
printf("%d\n",mincost);
}else{
puts("impossible");
}
}
}

UVA12433 【Rent a Car】的更多相关文章

  1. 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】

    说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...

  2. 【夯实PHP基础】PHP数组,字符串,对象等基础面面观

    本文地址 分享提纲 1.数组篇 2.字符创篇 3.函数篇 4.面向对象篇 5.其他篇 /*************************** 一.数组篇 Begin***************** ...

  3. 【Java学习系列】第3课--Java 高级教程

    本文地址 可以拜读: 从零开始学 Java 分享提纲: 1. Java数据结构 2. Java 集合框架 3. Java泛型 4. Java序列化 5. Java网络编程 6. Java发送Email ...

  4. 【夯实PHP基础】nginx php-fpm 输出php错误日志

    本文地址 原文地址 分享提纲: 1.概述 2.解决办法(解决nginx下php-fpm不记录php错误日志) 1. 概述 nginx是一个web服务器,因此nginx的access日志只有对访问页面的 ...

  5. 分布式学习系列【dubbo入门实践】

    分布式学习系列[dubbo入门实践] dubbo架构 组成部分:provider,consumer,registry,monitor: provider,consumer注册,订阅类似于消息队列的注册 ...

  6. 【第三篇】ASP.NET MVC快速入门之安全策略(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  7. 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  8. 【初码干货】在Window Server 2016中使用Web Deploy方式发布.NET Web应用的重新梳理

    在学习和工作的过程中,发现很多同事.朋友,在做.NET Web应用发布的时候,依然在走 生成-复制到服务器 这样的方式,稍微高级一点的,就是先发布到本地,再上传到服务器 这种方式不仅效率低下,而且不易 ...

  9. 【夯实PHP基础】PHP的反射机制

    本文地址 分享提纲: 1. 介绍 2. 具体例子 2.1 创建Persion类 2.2 反射过程 2.3 反射后使用 1. 介绍 -- PHP5添加了一项新的功能:Reflection.这个功能使得p ...

随机推荐

  1. 使用XAMPP配置Apache服务器反向代理

    反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时 ...

  2. Android资源管理利器Resources和AssetManager

    前言  : Android工程在运行的时候往往需要引用资源.使用 Resources 来获取 res 目录下的各种与设备相关的资源.而使用 AssetManager 来获取 assets 目录下的资源 ...

  3. reduce方法应用技巧

    定义和用法 reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值. 注意: reduce() 对于空数组是不会执行回调函数的. 浏览器支持 方法 Chro ...

  4. 【CSS】width和height计算

    width:calc(100% - 20px); width:-webkit-calc(100% - 20px);//chrome width:-moz-calc(100% - 20px);//fir ...

  5. 运维自动化神器ansible之group模块

    ansible之group模块 group模块是用来添加或者删除组 首先使用ansible-doc来查看用法 [root@note0 ansible]# ansible-doc -s group - ...

  6. Chrome 和 Chromedriver 的安装和配置

    1.Chrome 下载安装地址:https://www.google.com/intl/zh-CN_ALL/chrome/ 2.Chromedriver的安装 方法一: (1) brew cask i ...

  7. ES6入门之变量的解构赋值(二)

    前言 在上一章 ES6入门之let和const命令中我们对ES6的相关语法已经有了初步了解,上一章中我们主要学习了三大部分的内容,let命令的使用,块级作用域,const命令的使用,那么从本篇博客将进 ...

  8. MS09-012 PR提权

     漏洞编号:MS09-012 披露日期: 2009/4/14 受影响的操作系统:Windows 2008 x64 x86;XP;Server 2003 sp1 sp2; 测试系统:windows 20 ...

  9. Docker卷

    要解决的问题:在移除了现有容器或者添加了新容器时,之前容器的数据无法访问. 为避免上述问题,Docker提供了以下策略来持久化数据 tmpfs挂载 绑定挂载 卷 1.tmpfs挂载 2.绑定挂载 将D ...

  10. Linux面试题-7

    在日常管理中,通常CPU会影响系统性能的情况是: A A:CPU已满负荷地运转 B:CPU的运行效率为30% C:CPU的运行效率为50% D:CPU的运行效率为80% 下面那个命令可以终止一个用户的 ...