题目:
题意:
给你三种操作:(1)点到点建边;(2)点到区间建边;(3)区间到点建边;最后求起点到其他点的最短距离
分析:
最短距离无非建边跑Dijkstra即可,考虑如何对区间建边,如果直接对区间的每一点建边,那N^2的复杂度是行不通的,考虑将区间映射到线段树上的一个点:
(1)建两颗线段树,一颗表示出度的点,一颗表示入度的点
(2)对于表示出度的树,对每一节点和它父亲节点连一条长度为0的单向边(如果能从父亲出发,那么儿子也一定能);对于表示入度的树,对每一节点和它的儿子节点连一条长度为0的单向边(如果能到达父亲,那么也一定能达到儿子),并将其叶子节点和第一颗树对应的节点连一条长度为0的单向边(相当于从到达的点又出发),完全可以只建一颗树,但这样会走很多无用的边
(3)为了能区别两颗树,就必须给两颗树从新编号,建边时,直接找到对应的编号建边即可
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int