• 题解:

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

         假设中途经过某个非加油站的点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重构树做;


 1 #include<bits/stdc++.h>
 2 #define mk make_pair
 3 #define fir first
 4 #define sec second
 5 using namespace std;
 6 const int N=200010;
 7 int n,m,k,s,c[N],dis[N],nr[N],vis[N],fa[N],o,hd[N],cnt,ans[N];
 8 struct Edge{int u,v,nt,w;}E[N<<1],e[N],Q[N];
 9 void adde(int u,int v,int w){
10     E[o]=(Edge){u,v,hd[u],w};hd[u]=o++;
11     E[o]=(Edge){v,u,hd[v],w};hd[v]=o++;
12 }
13 typedef pair<int,int> pii;
14 priority_queue<pii,vector<pii>,greater<pii> > q;
15 void dijkstra(){
16     memset(dis,0x3f,sizeof(dis));
17     for(int i=1;i<=s;i++)q.push(mk(dis[c[i]]=0,c[i])),nr[c[i]]=c[i];
18     while(!q.empty()){
19         int u=q.top().sec;q.pop();
20         if(vis[u])continue;
21         vis[u]=1;
22         for(int i=hd[u];~i;i=E[i].nt){
23             int v=E[i].v;
24             if(dis[v]>dis[u]+E[i].w){
25                 dis[v]=dis[u]+E[i].w;
26                 nr[v]=nr[u];
27                 if(!vis[v])q.push(mk(dis[v],v));
28             }
29         }
30     }
31 }
32 bool cmp(const Edge&A,const Edge&B){return A.w<B.w;}
33 int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
34 int main(){
35     freopen("bzoj4144.in","r",stdin);
36     freopen("bzoj4144.out","w",stdout);
37     memset(hd,-1,sizeof(hd));
38     scanf("%d%d%d",&n,&s,&m);
39     for(int i=1;i<=s;i++)scanf("%d",&c[i]);
40     for(int i=1;i<=m;i++){
41         int u,v,w;
42         scanf("%d%d%d",&u,&v,&w);
43         adde(u,v,w);
44     }
45     scanf("%d",&k);
46     for(int i=1;i<=k;i++){scanf("%d%d%d",&Q[i].u,&Q[i].v,&Q[i].w),Q[i].nt=i;}
47     dijkstra();
48     for(int i=0;i<o;i+=2){
49         int u=E[i].u,v=E[i].v;
50         if(nr[u]!=nr[v])e[++cnt]=(Edge){nr[u],nr[v],0,E[i].w+dis[u]+dis[v]};
51     }
52     for(int i=1;i<=n;i++)fa[i]=i;
53     sort(e+1,e+cnt+1,cmp);
54     sort(Q+1,Q+k+1,cmp);
55     for(int i=1,j=1;i<=k;i++){
56         while(j<=cnt&&e[j].w<=Q[i].w){
57             int fx=find(e[j].u),fy=find(e[j].v);
58             if(fx!=fy)fa[fx]=fy;
59             j++;
60         }
61         ans[Q[i].nt] = find(Q[i].u)==find(Q[i].v);
62     }
63     for(int i=1;i<=k;i++){puts(ans[i]?"TAK":"NIE");}
64     return 0;
65 }

bzoj4144

转载于:https://www.cnblogs.com/Paul-Guderian/p/10204966.html

bzoj4144【AMPPZ2014】Petrol相关推荐

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

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

  2. 【AMPPZ2014】【BZOJ4143】The Lawyer

    Description Byteasar要制订m天的会议计划,一共有n场会议,第i场会议开始于第d[i]天的第a[i]秒,结束于第d[i]天的第b[i]秒. 对于每一天,请找出这一天的两场会议i,j, ...

  3. 【CentOS】利用Kubeadm部署Kubernetes (K8s)

    [CentOS]利用Kubeadm部署Kubernetes (K8s)[阅读时间:约10分钟] 一.概述 二.系统环境&项目介绍 1.系统环境 2.项目的任务要求 三.具体实验流程 1 系统准 ...

  4. 【Spring】框架简介

    [Spring]框架简介 Spring是什么 Spring是分层的Java SE/EE应用full-stack轻量级开源框架,以IOC(Inverse Of Control:反转控制)和AOP(Asp ...

  5. 【C#】类——里式转换

    类是由面对对象程序设计中产生的,在面向结构的程序设计例如C语言中是没有类这个概念的!C语言中有传值调用和传址调用的两种方式!在c语言中,主方法调用方法,通过传递参数等完成一些操作,其中比较常用的的数据 ...

  6. 【C#】Out与ref是干什么的?

    关于return: 1.最后没有写 return 语句的话,表示程序正常退出 2.不需要返回值时,存在return的作用 例子 void main() {return; //return退出该程序的作 ...

  7. 【软件工程】RUP与软件开发5大模型

    软件开发的5大模型 1.瀑布模型:按照人的思维一步一步的开发下去,如果需求分析得当,每个阶段顺利,结果还不错! 2.快速原型模型:后来人们发现,自己不可能一下子就把所有的需求搞清楚,总是在开发的过程中 ...

  8. 【VB】学生信息管理系统5——数据库代码

    这次学生信息管理系统在代码的理解过程中遇到了一些问题.总结如下: 1. sql server的安装过程各个步骤的意思.在安装SQL Server的时候按照网上的步骤,我觉得这个需要学完整个数据库再返回 ...

  9. 白化(预处理步骤)【转】

    白化(预处理步骤)[转] 介绍 我们已经了解了如何使用PCA降低数据维度.在一些算法中还需要一个与之相关的预处理步骤,这个预处理过程称为白化.举例来说,假设训练数据是图像,由于图像中相邻像素之间具有很 ...

最新文章

  1. mysql5.0镜像_Mysql5.0学习笔记(一)
  2. linux设备驱动学习笔记(1)
  3. NR 5G L1物理层
  4. 阻碍职场发达的十种做法
  5. [C# 设计模式] Adapter - 适配器模式(两种)
  6. linux达人养成计划学习笔记(四)—— 压缩命令
  7. Java后端带参跨域访问_java后端解决请求跨域
  8. 每个Java开发人员应拥有的持久断点
  9. android 圆形头像,自定义圆形ImageView
  10. java客户端程序用什么自动化测试_五大Java自动化测试框架
  11. 如何根据对象获取到对应的表名_Hands-on! 如何给 TiDB 添加新系统表
  12. cssci核心期刊(cssci核心期刊目录)
  13. 中南大学电磁场理论matlab,中南大学电磁场理论实验2.doc
  14. MySQL基础(2)----DDL DML DQL语言完成数据库的增删改查操作 数据备份(导入导出sql包) 单表查询
  15. 电源管理允许此设备唤醒计算机怎么关掉,电脑如何设置电源管理允许鼠标唤醒计算机...
  16. FAT32、NTFS、exFAT的区别
  17. 07-图6 旅游规划
  18. mac 上格式化移动硬盘出现MediaKit报告设备上的空间不足以执行请求的解决办法
  19. SQL--乱七八糟问题
  20. 老子双核的电脑为什么这么慢?

热门文章

  1. Matlab条形图bar误差棒绘制errorbar
  2. linux信任本地jar包,jar包在linux本地运行成功, 但是jenkins构建失败
  3. solve stiffness matrix in matlab
  4. 【java】swing构件的操作
  5. Java判断某年是不是闰年
  6. 动圈耳机振膜_动圈耳机和动铁耳机区别,以及选择
  7. 《R语言预测实战》PDF,数据及代码
  8. 关机时无人照管更新正在运行_路辉物流设备:无人化分拣作业驱动物流业降本增效...
  9. 输出高电平程序c语言,51用c语言怎么编程检测US-100超声波测距模块echo/rx引脚输出高电平时间长度,,谁能给我个模板...
  10. 【Java编程思想笔记】-集合1