题意:

给定n个点,m条有向边,邮箱容量。

起点在1,终点在n,開始邮箱满油。

以下m行表示起点终点和这条边的耗油量(就是长度)

再以下给出一个数字m表示有P个加油站,能够免费加满油。

以下一行P个数字表示加油站的点标。

再以下一个整数Q

以下Q行 u v 表示在u点有销售站,能够卖掉邮箱里的随意数量的油,每以单位v元。

问跑到终点能获得最多多少元。

先求个每一个点的最大剩余油量 f[i],

再把边反向,求每一个点距离终点的最短路 dis[i]。

然后枚举一下每一个销售点就可以,( f[i] - dis[i] ) * v。

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<math.h>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
#define N 10050
#define M 200010
#define inf 1000000
#define ll long long
struct Edge{
int from, to, dis, nex;
}edge[M], e[M];
int head[N],edgenum;
void add(int u,int v,int d){
Edge E={u,v,d,head[u]};
edge[edgenum] = E;
head[u] = edgenum++;
}
int H[N], edg;
void add2(int u,int v,int d){
Edge E={u,v,d,H[u]};
e[edg] = E;
H[u] = edg++;
}
int n, m, k;
int F[N], T[N];//F是车站 T是贩卖点
int f[N];//起点到这里最多能剩多少油
bool inq[N];
void spfa(){
queue<int>q;
memset(f,-1,sizeof f);
memset(inq, 0, sizeof inq);
f[1] = k; q.push(1);
while(!q.empty()){
int u = q.front(); q.pop(); inq[u] = 0;
for(int i = head[u]; ~i; i = edge[i].nex){
int v = edge[i].to;
if(f[v]< f[u] - edge[i].dis){
if(F[v])f[v]=k;
else
f[v] = f[u] - edge[i].dis;
if(!inq[v])inq[v] = 1, q.push(v);
}
}
}
}
int dis[N];//把边反一下跑出距离终点的最短路,也就是从这个点到终点最少要多少油
void bfs(){
for(int i = 1; i <= n; i++)dis[i] = inf;
memset(inq, 0, sizeof inq);
dis[n] = 0;
queue<int>q; q.push(n);
while(!q.empty()){
int u = q.front(); q.pop(); inq[u] = 0;
for(int i = H[u]; ~i ; i = e[i].nex){
int v = e[i].to; if(dis[v]>dis[u]+e[i].dis){
if(F[v])dis[v] = 0; //由于v是加油站,所以到这点剩下0的油量也没事,自然会补满的
else
dis[v] = dis[u]+e[i].dis;
if(!inq[v])inq[v] = 1, q.push(v);
}
}
}
}
void init(){memset(head, -1, sizeof head);edgenum = 0;memset(H, -1, sizeof H);edg = 0;}
int main(){
int i,u,v,d;
while(~scanf("%d %d %d",&n,&m,&k)){
init();
memset(F, 0, sizeof F);
memset(T, 0, sizeof T);
while(m--){
scanf("%d %d %d",&u,&v,&d);
add(u,v,d);
add2(v,u,d);
}
scanf("%d",&m); while(m--){scanf("%d",&u);F[u]=1;}
scanf("%d",&m); while(m--){scanf("%d %d",&u,&v);T[u]=v;}
spfa();
if(f[n]==-1){puts("-1");continue;}
bfs();
int ans = 0;
for(int i = 1; i <= n; i++)if(T[i] && f[i]!=-1&&dis[i]<inf)
ans = max(ans, (f[i] - dis[i])*T[i]);
cout<<ans<<endl;
}
return 0;
}
/*
2 1 1
1 2 2
1
1
0 */

ZOJ 3794 Greedy Driver spfa的更多相关文章

  1. ZOJ 3794 Greedy Driver

    两次SPFA 第一关找:从1没有出发点到另一个点的多少是留给油箱 把边反过来再找一遍:重每一个点到终点最少须要多少油 Greedy Driver Time Limit: 2 Seconds       ...

  2. ZOJ 2770 差分约束+SPFA

    Burn the Linked Camp Time Limit: 2 Seconds      Memory Limit: 65536 KB It is well known that, in the ...

  3. ZOJ Monthly, June 2014 月赛BCDEFGH题题解

    比赛链接:点击打开链接 上来先搞了f.c,,然后发现状态不正确,一下午都是脑洞大开,, 无脑wa,无脑ce...一样的错犯2次.. 硬着头皮搞了几发,最后20分钟码了一下G,不知道为什么把1直接当成不 ...

  4. ZOJ Monthly, June 2014 解题报告

    A.Another Recurrence Sequence problemId=5287">B.Gears 题目大意:有n个齿轮,一開始各自为一组.之后进行m次操作,包含下面4种类型: ...

  5. 深入linux kernel内核配置选项

    ============================================================================== 深入linux kernel内核配置选项 ...

  6. ZOJ 3080 ChiBi(spfa)

    ZOJ Problem Set - 3080 ChiBi Time Limit: 5 Seconds      Memory Limit: 32768 KB watashi's mm is so pr ...

  7. POJ 1860 Currency Exchange / ZOJ 1544 Currency Exchange (最短路径相关,spfa求环)

    POJ 1860 Currency Exchange / ZOJ 1544 Currency Exchange (最短路径相关,spfa求环) Description Several currency ...

  8. ZOJ 3946.Highway Project(The 13th Zhejiang Provincial Collegiate Programming Contest.K) SPFA

    ZOJ Problem Set - 3946 Highway Project Time Limit: 2 Seconds      Memory Limit: 65536 KB Edward, the ...

  9. ZOJ 3362 Beer Problem(SPFA费用流应用)

    Beer Problem Time Limit: 2 Seconds      Memory Limit: 32768 KB Everyone knows that World Finals of A ...

随机推荐

  1. css案例学习之层叠样式

    代码 <html> <head> <title>层叠特性</title> <style type="text/css"> ...

  2. CC++初学者编程教程(10) 搭建Android java C/C++ NDK QTforAndroid 开发环境

    1 安装JDK 2 点下一步 3 点下一步 4 开始安装 5 定制路径,点下一步 6 开始安装 7 安装完成, 8 解压缩 9 启动eclipse 10 看到启动画面 11 设置工作文件夹 12 单击 ...

  3. 图像处理库的比较:OpenCV,FreeImage,CImg,CxImage

    1.对OpenCV 的印象:功能十分的强大,而且支持目前先进的图像处理技术,体系十分完善,操作手册很详细,手册首先给大家补计算机视觉的知识,几乎涵盖了近10年内的主流算法: 然后将图像格式和矩阵运算, ...

  4. SEO高手在扯蛋?

    真正的高手SEO你在扯蛋吗?当大家都很会扯的时候,高手扯得肯定比你疼,不是他们 蛋比较敏感,而是他们的确更用力. 当你说我是SEO时,高手肯定说现在我在做的是SEM. 当你说我是SEM时,高手肯定在说 ...

  5. 动态规划——数字三角形(递归or递推or记忆化搜索)

    动态规划的核心就是状态和状态转移方程. 对于该题,需要用抽象的方法思考,把当前的位置(i,j)看成一个状态,然后定义状态的指标函数d(i,j)为从格子出发时能得到的最大和(包括格子本身的值). 在这个 ...

  6. 微信公众帐号开发。大家是用框架还是自己写的流程。现在遇到若干问题。请教各路大仙 - V2EX

    微信公众帐号开发.大家是用框架还是自己写的流程.现在遇到若干问题.请教各路大仙 - V2EX 微信公众帐号开发.大家是用框架还是自己写的流程.现在遇到若干问题.请教各路大仙

  7. 使用trim方法检测用户输入

    首先需要封装trim方法,可以去除字符串两端空格的方法 function trim(str) { return str.replace(/^\s+|\s+$/g, ""); } 获 ...

  8. html教程系列--form frameset

    <font> 标签: 规定文本的字体.字体尺寸.字体颜色.不建议直接使用,可以使用样式表替代. <footer> 标签:定义公用的底部信息.通常包含文档的作者.版权信息.使用条 ...

  9. oracle update语句的几点写法

    update两表关联的写法包括字查询 1.update t2 set parentid=(select ownerid from t1 where t1.id=t2.id); 2. update tb ...

  10. iphone--有关日历中NSDateFormatter中英文

    在使用日历使用中,获取星期的时候 NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; [dateFormat setDateFo ...