题意:

给定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. .net c# 正则表达式 平衡组/递归匹配

    原文 http://www.cnblogs.com/qiantuwuliang/archive/2011/06/11/2078482.html 平衡组/递归匹配 这里介绍的平衡组语法是由.Net Fr ...

  2. C++流操作之fstream

    在Windows平台对文件进行存取操作可选的方案有很多,如果采用纯C,则需要用到File*等,当然也可以直接调用Windows API来做:如果采用C++,首先想到的就是文件流fstream.虽然在C ...

  3. openjpa框架入门_项目框架搭建(二)

    Openjpa2.2+Mysql+Maven+Servlet+JSP 首先说明几点,让大家更清楚整体结构: 官方source code 下载:http://openjpa.apache.org/dow ...

  4. C/C++源代码的Include依赖关系图

    前一篇博文中我曾仔细介绍过如何查看C/C++代码的依赖项关系图,在这篇文章中我将会介绍如何使用Visualization and Modeling Feature Pack 工具包,查看C/C++源代 ...

  5. kubuntu/ubuntu下安装fcitx输入法

    1.添加fcitx源(官方的源是旧版,不推荐使用) sudo gedit /etc/apt/sources.list 在sources.list文件中尾部添加: deb http://ppa.laun ...

  6. bind新发现

    function foo(a,b){ this.val = a+b; } var bar = foo.bind(null, 'p1'); var baz = new bar('p2'); consol ...

  7. [转载自 文顶顶]iOS开发UI篇—程序启动原理和UIApplication

    一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就代表一个应用程序. (2)每一个应用都有自己的UIApplica ...

  8. 浅谈JavaScript中的内存管理

    一门语言的内存存储方式是我们学习他必须要了解的,接下来让我浅谈一下自己对他的认识. 首先说,JavaScript中的变量包含两种两种类型: 1)值类型或基本类型:undefined.null.numb ...

  9. java.util.vector中的vector的详细用法

    ArrayList会比Vector快,他是非同步的,如果设计涉及到多线程,还是用Vector比较好一些 import java.util.*; /** * 演示Vector的使用.包括Vector的创 ...

  10. log4j异常问题

    log4j:WARN No appenders could be found for logger   转自:最爱NBA 直接写我的解决办法:在src下面新建file名为log4j.propertie ...