一、题目描述
二、算法分析说明与代码编写指导
每头牛都会到点 x 参加聚会,然后返回。但路是单向的,因此回去的路可能与来的路不同。
如果对每个点都跑一次 Dijkstra,或者直接跑一次 Floyd 算法,由于复杂度达到 O(n^3),在本题的数据规模下会超时。
从 x 回去的最短路可以直接套 Dijkstra 算法求解单源最短路径。从各点来到 x 的最短路径也只需要跑一次 Dijkstra 就可以求出来,方法是先求出从 x 回去的路,然后将邻接矩阵转置,此时所有边的方向变为相反,然后再以 x 为源点跑一次 Dijkstra 就可以了。可以验证,当其它点到 x 存在双向路径时,这样的处理不会影响结果;当其它点到 x 仅存在单向路径时,从 x 向各点跑单源最短路径得到的到各点的最短路长度与对每个点跑一次最短路得到的长度是一样的。
三、AC 代码
#include<cstdio>
#include<algorithm>
#include<bitset>
#pragma warning(disable:4996)
using namespace std;
const unsigned tmax = 1 << 30;
unsigned N, n, m, x, u, v, t, G[1001][1001], d1[1001], d2[1001