• 题解:

 首先注意到起点和终点都是加油站;

         假设中途经过某个非加油站的点u,u连到v,离u最近的加油站是x,那么从u到x加油后回到u,再到v一定不比直接从u到v差;

       因为u一定从某个加油站来,设最后经过的加油站为y,u点油量为B1 = b - dis(y,u),而如果u不可以走到x一定不能走到其他任何加油站自然也到不了终点,如果可以到x加满油也一定可以再从x回来,油量为B2 = b-dis(x,u)  , 因为dis(y,u) >= dis(x,u)所以B1 <= B2 ;

       考虑重新构图:nr[x]表示离x最近的加油站,dis[x]表示x和nr[x]的距离,可以用多源点dijkstra处理出所有nr[x]和dis[x];

       对于原图中边(u,v) 连边(nr[u] , nr[v] , dis[u] + dis[v] + w(u,v)   ) ;

       这就变成了一个图,只选<=b 的边问两点连通性,可以离线或者用kruskal重构树做;


 #include<bits/stdc++.h>
#define mk make_pair
#define fir first
#define sec second
using namespace std;
const int N=;
int n,m,k,s,c[N],dis[N],nr[N],vis[N],fa[N],o,hd[N],cnt,ans[N];
struct Edge{int u,v,nt,w;}E[N<<],e[N],Q[N];
void adde(int u,int v,int w){
E[o]=(Edge){u,v,hd[u],w};hd[u]=o++;
E[o]=(Edge){v,u,hd[v],w};hd[v]=o++;
}
typedef pair<int,int> pii;
priority_queue<pii,vector<pii>,greater<pii> > q;
void dijkstra(){
memset(dis,0x3f,sizeof(dis));
for(int i=;i<=s;i++)q.push(mk(dis[c[i]]=,c[i])),nr[c[i]]=c[i];
while(!q.empty()){
int u=q.top().sec;q.pop();
if(vis[u])continue;
vis[u]=;
for(int i=hd[u];~i;i=E[i].nt){
int v=E[i].v;
if(dis[v]>dis[u]+E[i].w){
dis[v]=dis[u]+E[i].w;
nr[v]=nr[u];
if(!vis[v])q.push(mk(dis[v],v));
}
}
}
}
bool cmp(const Edge&A,const Edge&B){return A.w<B.w;}
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
int main(){
freopen("bzoj4144.in","r",stdin);
freopen("bzoj4144.out","w",stdout);
memset(hd,-,sizeof(hd));
scanf("%d%d%d",&n,&s,&m);
for(int i=;i<=s;i++)scanf("%d",&c[i]);
for(int i=;i<=m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
adde(u,v,w);
}
scanf("%d",&k);
for(int i=;i<=k;i++){scanf("%d%d%d",&Q[i].u,&Q[i].v,&Q[i].w),Q[i].nt=i;}
dijkstra();
for(int i=;i<o;i+=){
int u=E[i].u,v=E[i].v;
if(nr[u]!=nr[v])e[++cnt]=(Edge){nr[u],nr[v],,E[i].w+dis[u]+dis[v]};
}
for(int i=;i<=n;i++)fa[i]=i;
sort(e+,e+cnt+,cmp);
sort(Q+,Q+k+,cmp);
for(int i=,j=;i<=k;i++){
while(j<=cnt&&e[j].w<=Q[i].w){
int fx=find(e[j].u),fy=find(e[j].v);
if(fx!=fy)fa[fx]=fy;
j++;
}
ans[Q[i].nt] = find(Q[i].u)==find(Q[i].v);
}
for(int i=;i<=k;i++){puts(ans[i]?"TAK":"NIE");}
return ;
}

bzoj4144

bzoj4144【AMPPZ2014】Petrol的更多相关文章

  1. 【BZOJ】【4144】【AMPPZ2014】Petrol

    最短路+最小生成树+倍增 图论问题中综合性较强的一题= =(Orz vfk) 比较容易发现,关键的还是有加油站的这些点,其他点都是打酱油的. 也就是说我们重点是要求出 关键点之间的最短路. 这玩意…… ...

  2. 【BZOJ】【4145】【AMPPZ2014】The Prices

    状压DP/01背包 Orz Gromah 容易发现m的范围很小……只有16,那么就可以状压,用一个二进制数来表示买了的物品的集合. 一种简单直接的想法是:令$f[i][j]$表示前$i$个商店买了状态 ...

  3. 【BZOJ】【4146】 【AMPPZ2014】Divisors

    暴力 由于值的范围很小($ \leq 2*10^6$),所以用一个cnt数组统计每个值有多少个数,然后从小到大,统计每个数的倍数即可. 根据调和数?的神奇性质= =这样是$O(nlogn)$的…… / ...

  4. [题解] [BZOJ4144] 「AMPPZ2014」Petrol

    题面 怎么是权限题啊 题解 有一次考过, 但是不记得了 如果每个点都是加油站的话, 这道题就是货车运输 考虑如何转化 我们可以设

  5. 【BZOJ4149】[AMPPZ2014]Global Warming 单调栈+RMQ+二分

    [BZOJ4149][AMPPZ2014]Global Warming Description 给定一个序列a[1],a[2],...,a[n].请从中选出一段连续子序列,使得该区间最小值唯一.最大值 ...

  6. 【BZOJ4146】[AMPPZ2014]Divisors

    [BZOJ4146][AMPPZ2014]Divisors Description 给定一个序列a[1],a[2],...,a[n].求满足i!=j且a[i]|a[j]的二元组(i,j)的个数. In ...

  7. 【BZOJ】4147: [AMPPZ2014]Euclidean Nim

    [算法]博弈论+数论 [题意]给定n个石子,两人轮流操作,规则如下: 轮到先手操作时:若石子数<p添加p个石子,否则拿走p的倍数个石子.记为属性p. 轮到后手操作时:若石子数<q添加q个石 ...

  8. 【BZOJ4152】[AMPPZ2014]The Captain 最短路

    [BZOJ4152][AMPPZ2014]The Captain Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1 ...

  9. 【BZOJ4145】[AMPPZ2014]The Prices 状压DP

    [BZOJ4145][AMPPZ2014]The Prices Description 你要购买m种物品各一件,一共有n家商店,你到第i家商店的路费为d[i],在第i家商店购买第j种物品的费用为c[i ...

随机推荐

  1. shell 参数

    转:http://hi.baidu.com/ipvsadm/item/489d9e16460195ddbe9042ee linux中shell变量$#,$@,$0,$1,$2的含义解释 linux中s ...

  2. mybatis拦截器使用

    目录 mybatis 拦截器接口Interceptor spring boot + mybatis整合 创建自己的拦截器MyInterceptor @Intercepts注解 mybatis拦截器入门 ...

  3. Siki_Unity_2-2_NGUI_UI插件学习(3.6.8版本)(未学)

    Unity 2-2 NGUI UI插件学习(3.6.8版本)(未学)

  4. Spring 定时任务Scheduled 开发详细图文

    Spring 定时任务Scheduled 开发 文章目录 一.前言 1.1 定时任务 1.2 开发环境 1.3 技术实现 二.创建包含WEB.xml 的Maven 项目 2.1 创建多模块项目task ...

  5. Linux系统服务(daemon)(鸟哥Linux私房菜笔记)

    Linux系统服务(daemon) 一.SystemV的init管理机制(脚本式启动)1.服务启动分类stand alone 独立启动模式super daemon 总管程序 2.服务的启动.关闭与观察 ...

  6. HashMap 和 HashTable 到底哪不同 ?

    HashMap 和 HashTable 到底哪不同 ? 2017/05/29 | 分类: 基础技术 | 1 条评论 | 标签: HASHMAP, HASHTABLE 分享到: 原文出处: 程序员赵鑫 ...

  7. Linux内核学习笔记(2)-- 父进程和子进程及它们的访问方法

    Linux系统中,进程之间有一个明显的继承关系,所有进程都是 PID 为1的 init 进程的后代.内核在系统启动的最后阶段启动 init 进程.该进程读取系统的初始化脚本(initscript)并执 ...

  8. 深度学习论文笔记:Deep Residual Networks with Dynamically Weighted Wavelet Coefficients for Fault Diagnosis of Planetary Gearboxes

    这篇文章将深度学习算法应用于机械故障诊断,采用了“小波包分解+深度残差网络(ResNet)”的思路,将机械振动信号按照故障类型进行分类. 文章的核心创新点:复杂旋转机械系统的振动信号包含着很多不同频率 ...

  9. 全国城市一卡通一级TSM平台业务架构及意义

    [导读]TSM平台是一种具有鲜明行业属性的平台,因此,各行业都建立了本行业的TSM平台.为促进城市一卡通行业移动支付的快速发展,住房和城乡建设部也建立了全国城市一卡通行业一级TSM平台. 作为住建部标 ...

  10. 《linux内核与分析》第三周

    20135130王川东 实验:构造一个简单的Linux系统的MenuOS 命令:qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd root ...