• 题解:

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

         假设中途经过某个非加油站的点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. HttpRunner安装笔记(1)安装环境准备:pyenv安装

    HttpRunner建议在Python 3.4 及以上版本,但是centos有其他功能模块基于python2.7,所以使用pyenv安装多版本pyhon版本. pyenv 是一款特别好用的Python ...

  2. JMeter与WireShark

    最近在学习JMeter,刚学了一点皮毛,就掉入了WireShark的坑,我发现在学习的道路上就是不断的给自己挖坑,之前在学习LoadRunner的道路上,遇到的坑更大,就单纯的安装LR就耗费了两个星期 ...

  3. 2019展望计划(Lamica 2019-Year Plan):

    1,家人身体健康.2,好好上课,考试顺利,不要挂科.3,PETS3 9月份 杭州 一定要过.4,PETS3通过后,进军日语N3-N2.5,在杭州找一份合适的工作(底线6K).6,在杭州交到新朋友.7, ...

  4. 在进行分布式框架搭建的过程中,出现问题advised by org.springframework.transaction.interceptor.TransactionInterceptor.invoke(org.aopalliance.intercept.MethodInvocation)?

    今天在进行宜立方商城,进行文件配置的时间,遇到如下的问题,问题是:advised by org.springframework.transaction.interceptor.TransactionI ...

  5. 城市规模越大,工资、GDP、犯罪率越高:4.5星|《规模》

    规模 信息浓度非常高的一本书.篇幅也不小,纸书有568页,致谢与注释只占7%. 全书讲各种复杂的东西中存在的普遍规律:哺乳动物体重每增加一倍,心率降低25%:城市人口每增加一倍,加油站只增加85%:城 ...

  6. JAVA学习笔记--接口

    一.抽象类和抽象方法 在谈论接口之前,我们先了解一下抽象类和抽象方法.我们知道,在继承结构中,越往下继承,类会变得越来越明确和具体,而往上回溯,越往上,类会变得越抽象和通用.我们有时候可能会需要这样一 ...

  7. Golang项目开发管理

    工具 1. task(项目管理,类似于make) go get -u -v github.com/go-task/task/cmd/task 2. gopm(go依赖管理) go get -u git ...

  8. 《JavaScript》JS中的常用方法attr(),splice()

    1.jquery中用attr()方法来获取和设置元素属性,attr是attribute(属性)的缩写,在jQuery DOM操作中会经常用到attr(),attr()有4个表达式. attr(属性名) ...

  9. 四则运算2+psp0

    程序要求: 1.题目避免重复 2.可定制(数量\打印方式) 3.可以一下控制参数 ① 是否有乘除法 ② 是否有括号(最多支持十个数参与运算) ③ 数值范围 ④加减有无负数 ⑤除法有无余数 分析:① 如 ...

  10. 寒假MOOC学习计划

    我选择的是西北工业大学的课程,理由如下: 首先,选择这门课的网友还蛮多的,特意看了一下评价,也不错: 其次,这个课程的排版与我从图书馆借来的一本书内容排版比较符合,可以结合起来一起看,说不定会有更多收 ...