题目大意:
给定一个点x,求每个点到这个点再回来所用时间的最大值。
思路:
一开始想用 F l o y d Floyd Floyd,没过。。 T L E TLE TLE后来先对 x x x求了一遍最短路,再对每一个点依次求最短路取最大值,又 T L E TLE TLE😥。
这里介绍一种巧妙的方法,我们叫做矩阵转置。
我们首先对
x
x
x点求一遍最短路,由于是单向图,我们将图中的边进行交换即可,对
s
w
a
p
(
g
[
i
]
[
j
]
,
g
[
j
]
[
i
]
)
swap(g[i][j],g[j][i])
swap(g[i][j],g[j][i])进行操作,就达到了置换矩阵的目的,使得我们将每个点走向x点的问题转换为从
x
x
x点走到每个点,这样只需要进行
2
2
2次
d
i
j
k
s
t
r
a
dijkstra
dijkstra算法大大缩短了时间复杂度。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
#include<cstdio>
#include<cmath>
#include<iomanip>
#include<sstream>
#include<queue>
#define fr for
#define pi 3.1415926535
#define me(a,b,c) memset(a,b,sizeof c)
#define cut cout
#define eps 0.000000001
//#define x first
//#define y second
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
typedef pair<int, int> pii;
const int N = 1e6 + 10;
int dis[1010];
bool st[1010];
int n, m, x;
int g[1010][1010];
void dijkstra(int x) {
for (int i = 1; i <= n; i++)dis[i] = 0x3f3f3f3f, st[i] = false;
dis[x] = 0;
for (int i = 0; i < n - 1; i++) {
int t = -1;
for (int j = 1; j <= n; j++)
if (!st[j] && (t == -1 || dis[t] > dis[j]))
t = j;
for (int j = 1; j <= n; j++)
dis[j] = min(dis[j], dis[t] + g[t][j]);
st[t] = true;
}
}
void change() {
for (int i = 1; i <= n; i++)
for (int j = i+1; j <= n; j++)
swap(g[i][j], g[j][i]);
}
int main() {
cin >> n >> m >> x;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (i == j)g[i][j] = 0;
else g[i][j] = 0x3f3f3f3f;
for (int i = 1; i <= m; i++) {
int a, b, c;
cin >> a >> b >> c;
g[a][b] = c;
}
int ans[1010];
dijkstra(x);
for (int i = 1; i <= n; i++)ans[i] = dis[i];
change();
dijkstra(x);
int res = 0;
for (int i = 1; i <= n; i++) {
ans[i] += dis[i];
res = max(res, ans[i]);
}
cout << res << endl;
}
//
//Buddha blesses the code with no bugs
// _ooOoo_
// o8888888o
// 88" . "88
// (| -_- |)
// O\ = /O
// ____/`---'\____
// .' \| |// `.
// / \||| : |||// \
// / _||||| -:- |||||- \
// | | \\ - /// | |
// | \_| ''\---/'' | |
// \ .-\__ `-` ___/-. /
// ___`. .' /--.--\ `. . __
// ."" '< `.___\_<|>_/___.' >'"".
// | | : `- \`.;`\ _ /`;.`/ - ` : | |
// \ \ `-. \_ __\ /__ _/ .-` / /
// ======`-.____`-.___\_____/___.-`____.-'======
// `=---='
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//