道路和航线
https://loj.ac/problem/10081 题目描述 一张图,有由T个节点,R条双向边和P条单向边组成,每条边有边权且可能存在负权,求能否从S到达每个节点并且输出最小花费。 思路 首先第一想法,把这张图建出来,在跑一遍spfa即可,然而它显然被卡了,不过似乎可以用双端队列优化水过去。 接下就是正解。我们考虑对于所有的道路,都是正权,我们可以用Dijkstra做,而对于航线,不存在环。因此,如果我们将道路相连的连通图缩点之后,得到必定是DAG,而DAG显然可以用拓扑排序更新最短路。 所以我们只需要先把双向边的图建出来,跑一遍tarjan缩点,再进行toposort,每次更新时把连通块中所有节点都加入Dijkstra的优先队列中,对于每个点进行更新dis数组。在进行Dijkstra时把单向边也更新一遍即可。 代码 #include<bits/stdc++.h> using namespace std; const int N=250020,M=1e5+10; const int INF=0x3f3f3f3f; int head[N],tot,to[M],nxt[M],w[M]; void add_edge(int x,int y,int z) //双向边建图 { nxt[++tot]=head[x]; head[x]=tot; to[tot]=y; w