「GXOI / GZOI2019」旅行者
我还是太傻了
考虑每一条边的贡献,对于一条有向边\((u,v,w)\),我们求出\(k\)个关键点中到\(u\)最近的距离\(dis_1\),以及\(v\)到\(k\)个关键点中最近的距离\(dis_2\),直接用\(dis_1+w+dis_2\)来更新答案就好了
所以正反两遍\(Dij\)就好
但是需要注意到一点,如果这两个点\(k\)个关键点中到\(u\)最近的点和\(v\)最近的·点相同,那么我们不能计入答案,因为这样只是走了一个环
代码
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define re register
#define LL long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
const int maxn=1e5+5;
const LL inf=9999999999999;
inline int read() {
    char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
    while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
int st[maxn],n,m,K;
int X[maxn*5],Y[maxn*5],Z[maxn*5];
struct Shortest {
    struct E{int v,nxt,w;}e[maxn*5];
    int head[maxn],vis[maxn],g[maxn],num;LL d[maxn];
    #define mp std::make_pair
    typedef std::pair<LL,int> pii;
    std::priority_queue<pii,std::vector<pii>,std::greater<pii> > q;
    inline void add(int x,int y,int z) {
        e[++num].v=y;e[num].nxt=head[x];e[num].w=z;head[x]=num;
    }
    inline void clear() {
        num=0;memset(head,0,sizeof(head));memset(vis,0,sizeof(vis));
    }
    inline void Dij() {
        for(re int i=1;i<=n;i++) d[i]=inf;
        for(re int i=1;i<=K;i++) d[st[i]]=0,q.push(mp(0,st[i])),g[st[i]]=st[i];
        while(!q.empty()) {
            int k=q.top().second;q.pop();
            if(vis[k]) continue;
            vis[k]=1;
            for(re int i=head[k];i;i=e[i].nxt)
            if(d[e[i].v]>d[k]+e[i].w) {
                d[e[i].v]=d[k]+e[i].w;g[e[i].v]=g[k];
                q.push(mp(d[e[i].v],e[i].v));
            }
        }
    }
}D[2];
int main() {
    int T=read();
    while(T--) {
        D[0].clear(),D[1].clear();
        n=read(),m=read();K=read();
        for(re int x,y,z,i=1;i<=m;i++) {
            x=read(),y=read(),z=read();
            D[0].add(x,y,z);D[1].add(y,x,z);
            X[i]=x,Y[i]=y,Z[i]=z;
        }
        for(re int i=1;i<=K;i++) st[i]=read();
        D[0].Dij(),D[1].Dij();
        LL ans=inf;
        for(re int i=1;i<=m;i++)
            if(D[0].g[X[i]]!=D[1].g[Y[i]])
                ans=min(ans,D[0].d[X[i]]+Z[i]+D[1].d[Y[i]]);
        printf("%lld\n",ans);
    }
    return 0;
}
「GXOI / GZOI2019」旅行者的更多相关文章
- 【LOJ】#3087. 「GXOI / GZOI2019」旅行者
		LOJ#3087. 「GXOI / GZOI2019」旅行者 正着求一遍dij,反着求一遍,然后枚举每条边,从u到v,如果到u最近的点和v能到的最近的点不同,那么可以更新答案 没了 #include ... 
- LOJ#3087. 「GXOI / GZOI2019」旅行者(最短路)
		题面 传送门 题解 以所有的感兴趣的城市为起点,我们正着和反着各跑一边多源最短路.记\(c_{0/1,i}\)分别表示正图/反图中离\(i\)最近的起点,那么对于每条边\((u,v,w)\),如果\( ... 
- 【LOJ3087】「GXOI / GZOI2019」旅行者
		题意 给定一个 \(n\) 个点 \(m\) 条边的的有向图,给出 \(k\) 个关键点,求关键点两两最短路的最小值. \(n\le 10^5, m\le 5\cdot 10^5\). 题解 二进制分 ... 
- 「GXOI / GZOI2019」简要题解
		「GXOI / GZOI2019」简要题解 LOJ#3083. 「GXOI / GZOI2019」与或和 https://loj.ac/problem/3083 题意:求一个矩阵的所有子矩阵的与和 和 ... 
- LOJ#3083.「GXOI / GZOI2019」与或和_单调栈_拆位
		#3083. 「GXOI / GZOI2019」与或和 题目大意 给定一个\(N\times N\)的矩阵,求所有子矩阵的\(AND(\&)\)之和.\(OR(|)\)之和. 数据范围 \(1 ... 
- Loj #3085. 「GXOI / GZOI2019」特技飞行
		Loj #3085. 「GXOI / GZOI2019」特技飞行 题目描述 公元 \(9012\) 年,Z 市的航空基地计划举行一场特技飞行表演.表演的场地可以看作一个二维平面直角坐标系,其中横坐标代 ... 
- 【LOJ】#3088. 「GXOI / GZOI2019」旧词
		LOJ#3088. 「GXOI / GZOI2019」旧词 不懂啊5e4感觉有点小 就是离线询问,在每个x上挂上y的询问 然后树剖,每个节点维护轻儿子中已经被加入的点的个数个数乘上\(dep[u]^{ ... 
- 【LOJ】#3086. 「GXOI / GZOI2019」逼死强迫症
		LOJ#3086. 「GXOI / GZOI2019」逼死强迫症 这个就是设状态为\(S,j\)表示轮廓线为\(S\),然后用的1×1个数为j 列出矩阵转移 这样会算重两个边相邻的,只要算出斐波那契数 ... 
- 【LOJ】#3085. 「GXOI / GZOI2019」特技飞行
		LOJ#3085. 「GXOI / GZOI2019」特技飞行 这显然是两道题,求\(C\)是一个曼哈顿转切比雪夫后的线段树扫描线 求\(AB\),对向交换最大化和擦身而过最大化一定分别为最大值和最小 ... 
随机推荐
- MFC数据库操作
			本例采用Microsoft SQL2008建立的一个数据库表 /****链接数据库操作**/ 在stdafx.h的头文件中加入 #import "C:\Program Files\Commo ... 
- [javaSE] 数组(获取最值)
			数组的常见操作(获取最值) 1.获取最值需要进行比较,每一次比较都会有一个较大的值,因为该值不确定,通过一个变量进行存储 2.让数组中的每一个元素都和这个变量中的值进行比较,如果大于了变量中的值,就用 ... 
- Android全屏的两种方法
			在开发中我们经常需要把我们的应用设置为全屏,这里我所知道的有俩中方法,一中是在代码中设置,另一种方法是在配置文件里改! 一.在代码中设置: [java] view plain copy package ... 
- Dllmain的作用
			DllMain函数是DLL模块的默认入口点.当Windows加载DLL模块时调用这一函数.系统首先调用全局对象的构造函数,然后调用全局函数 DLLMain.DLLMain函数不仅在将DLL链接加载到进 ... 
- jQuery箭头切换图片 - 学习笔记
			jQuery箭头切换图片 布局 3d位移 变形原点 jQuery transform:translate3d(x,y,z): x 代表横向坐标移向量的长度 y 代表纵向坐标移 ... 
- 阿里云短信服务Java版
			短信服务管理平台 https://dysms.console.aliyun.com/dysms.htm java短信发送API https://help.aliyun.com/document_ ... 
- Windows win7下VMware Virtual Ethernet Adapter未识别网络解决方法
			win7下VMware Virtual Ethernet Adapter未识别网络解决方法[摘] by:授客 QQ:1033553122 问题描述 win7系统下安装VMware,查看网卡适配器设置, ... 
- Pig order by用法举例
			sorted = order data by $0; 数值类型按照数值大小比较 chararray类型按照字符的字典顺序比较 bytearray按照字节的字典顺序比较 复杂类型(map.tuple ... 
- C#Owin auth20开发 OwinStartup 不会触发的解决办法
			在使用owin auth20设置token时候遇到一个问题.项目中已经存在如下初始化配置类 using Microsoft.Owin; using Owin; [assembly: OwinStart ... 
- 抓取远程master分支到本地,并与UI分支合并
			1.pull (1)UI: git add . git commit -m git checkout master (2)master: git pull origin master git ... 
