[LOJ3087][GXOI/GZOI2019]旅行者——堆优化dijkstra
题目链接:
我们考虑每条边的贡献,对每个点求出能到达它的最近的感兴趣的城市(设为$f[i]$,最短距离设为$a[i]$)和它能到达的离它最近的感兴趣的城市(设为$g[i]$,最短距离设为$b[i]$)。
那么每条边$(u,v,w)$的贡献就是$a[u]+w+b[v]$,用这个值去更新答案即可(这个值代表$f[u]$到$g[v]$的最短路长度)。
但要注意一条边能更新答案需要满足$f[u]\neq g[v]$,因为要保证起点和终点不同。
手画一下就可以知道最短路径上的边至少有一条会更新答案,即不可能发生最短路径上每条边的$f[u]=g[v]$。
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<bitset>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define pr pair<ll,int>
using namespace std;
int tot;
int head[100010];
int to[600010];
int nex[600010];
int val[600010];
ll ans;
int tim;
int n,m,k;
int u[500010];
int v[500010];
int w[500010];
ll d[100010];
ll c[100010];
int f[100010];
int g[100010];
int a[100010];
int vis[100010];
priority_queue< pr,vector<pr>,greater<pr> >q;
void init()
{
memset(head,0,sizeof(head));
memset(val,0,sizeof(val));
memset(nex,0,sizeof(nex));
memset(to,0,sizeof(to));
memset(f,0,sizeof(f));
memset(c,0,sizeof(c));
memset(g,0,sizeof(g));
memset(d,0,sizeof(d));
memset(v,0,sizeof(v));
memset(w,0,sizeof(w));
memset(u,0,sizeof(u));
tot=0;
}
void add(int x,int y,int z)
{
nex[++tot]=head[x];
head[x]=tot;
to[tot]=y;
val[tot]=z;
}
void dijkstra(int opt)
{
tot=0;
memset(vis,0,sizeof(vis));
memset(head,0,sizeof(head));
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++)
{
d[i]=1ll<<60;
}
for(int i=1;i<=k;i++)
{
d[a[i]]=0;
f[a[i]]=a[i];
q.push(make_pair(d[a[i]],a[i]));
}
for(int i=1;i<=m;i++)
{
if(!opt)
{
add(u[i],v[i],w[i]);
}
else
{
add(v[i],u[i],w[i]);
}
}
while(!q.empty())
{
int now=q.top().second;
q.pop();
if(vis[now])
{
continue;
}
vis[now]=1;
for(int i=head[now];i;i=nex[i])
{
if(d[to[i]]>d[now]+val[i])
{
d[to[i]]=d[now]+val[i];
f[to[i]]=f[now];
q.push(make_pair(d[to[i]],to[i]));
}
}
}
}
void solve()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&u[i],&v[i],&w[i]);
}
for(int i=1;i<=k;i++)
{
scanf("%d",&a[i]);
}
dijkstra(0);
for(int i=1;i<=n;i++)
{
c[i]=d[i],g[i]=f[i];
}
dijkstra(1);
ll ans=1ll<<60;
for(int i=1;i<=m;i++)
{
if(g[u[i]]&&f[v[i]]&&g[u[i]]!=f[v[i]])
{
ans=min(ans,c[u[i]]+d[v[i]]+w[i]);
}
}
printf("%lld\n",ans);
}
int main()
{
scanf("%d",&tim);
while(tim--)
{
init();
solve();
}
}
[LOJ3087][GXOI/GZOI2019]旅行者——堆优化dijkstra的更多相关文章
- P5304 [GXOI/GZOI2019]旅行者
题目地址:P5304 [GXOI/GZOI2019]旅行者 这里是官方题解 一个图 \(n\) 点 \(m\) 条边,里面有 \(k\) 个特殊点,问这 \(k\) 个点之间两两最短路的最小值是多少? ...
- BZOJ 3040 最短路 (堆优化dijkstra)
这题不是裸的最短路么?但是一看数据范围就傻了.点数10^6,边数10^7.这个spfa就别想了(本来spfa就是相当不靠谱的玩意),看来是要用堆优化dijkstra了.但是,平时写dijkstra时为 ...
- UVA - 11374 - Airport Express(堆优化Dijkstra)
Problem UVA - 11374 - Airport Express Time Limit: 1000 mSec Problem Description In a small city c ...
- 【BZOJ5506】[GXOI/GZOI2019]旅行者(最短路)
[BZOJ5506][GXOI/GZOI2019]旅行者(最短路) 题面 BZOJ 洛谷 题解 正着做一遍\(dij\)求出最短路径以及从谁转移过来的,反过来做一遍,如果两个点不由同一个点转移过来就更 ...
- BZOJ5415[Noi2018]归程——kruskal重构树+倍增+堆优化dijkstra
题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 n 个节点.m 条边的无向连通图(节点的编号从 1 至 n).我们依次用 l,a 描述一条边的长度.海 ...
- 配对堆优化Dijkstra算法小记
关于配对堆的一些小姿势: 1.配对堆是一颗多叉树. 2.包含优先队列的所有功能,可用于优化Dijkstra算法. 3.属于可并堆,因此对于集合合并维护最值的问题很实用. 4.速度快于一般的堆结构(左偏 ...
- POJ 3635 - Full Tank? - [最短路变形][手写二叉堆优化Dijkstra][配对堆优化Dijkstra]
题目链接:http://poj.org/problem?id=3635 题意题解等均参考:POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]. 一些口胡: ...
- 【堆优化Dijkstra+字典序最短路方案】HDU1385-Minimum Transport Cost
[题目大意] 给出邻接矩阵以及到达各个点需要付出的代价(起点和终点没有代价),求出从给定起点到终点的最短路,并输出字典序最小的方案. [思路] 在堆优化Dijkstra中,用pre记录前驱.如果新方案 ...
- 【bzoj5197】[CERC2017]Gambling Guide 期望dp+堆优化Dijkstra
题目描述 给定一张n个点,m条双向边的无向图. 你要从1号点走到n号点.当你位于x点时,你需要花1元钱,等概率随机地买到与x相邻的一个点的票,只有通过票才能走到其它点. 每当完成一次交易时,你可以选择 ...
随机推荐
- 【Vue.js】代码优化:在dom中加一行v-if就可少写一个循环类方法
[问题描述] 把当前用户的购物车中(cartList),商品(good)选中字段checked = true的商品在订单页面中进行展示出来. [一般做法](两次循环) 首先取出当前用户的购物车列表,循 ...
- Springboot 系列(四)Spring Boot 日志框架
注意:本 Spring Boot 系列文章基于 Spring Boot 版本 v2.1.1.RELEASE 进行学习分析,版本不同可能会有细微差别. 前言 Spring 框架选择使用了 JCL 作为默 ...
- 个人对【依赖倒置(DIP)】、【控制反转(IOC)】、【依赖注入(DI)】浅显理解
一.依赖倒置(Dependency Inversion Principle) 依赖倒置是面向对象设计领域的一种软件设计原则.(其他的设计原则还有:单一职责原则.开放封闭原则.里式替换原则.接口分离原则 ...
- 使用cobbler工具实现centos 6,7系统的自动化安装
vmware里面准备两台虚拟机,一台用于安装cobbler服务器,另一台当作测试机使用,cobbler服务器需要两块网卡,一块需要连接外网,需要使用epel源.测试机使用一块仅主机的模式的网卡,注意要 ...
- Gerrit系统框架介绍
Gerrit目录介绍 转自:https://blog.csdn.net/tanshizhen119/article/details/79889242 先上图 bin/ : 主要是放gerrit.sh启 ...
- 在docker中初次体验.net core 2.0
.net core的跨平台有了Linux,不能没有docker……网上的系列文章一大推,特别是docker还有了中文官网:https://www.docker-cn.com/ .上面说的很清楚了,这里 ...
- 在 asp.net core 中使用类似 Application 的服务
在 asp.net core 中使用类似 Application 的服务 Intro 在 asp.net 中,我们可以借助 Application 来保存一些服务器端全局变量,比如说服务器端同时在线的 ...
- Puppeteer学习之小试牛刀
最近有了写文章的动力了,一方面是受到了很多前辈们的启示,另一方面也是为了记录下来更好地学以致用.闲言少叙,先说说Puppeteer是什么. Puppeteer是一个node库,提供了一些用来操作Chr ...
- go语言框架gin之集成swagger
1.安装swag 在goLand中直接使用go get -u github.com/swaggo/swag/cmd/swag命令安装会报错 翻了很多博客,都没找到太合适的办法,根据博客中所写的操作还是 ...
- django连接sqlserver
http://www.cnblogs.com/yijiaming/p/9684601.html 方法一: 1.需要安装pymssql pip install pymssql 2.使用方法: impor ...