题意:
n头牛先从各点出发到x点,再从x回到出发点,求往返花费时间最长的牛的时长
思路:
1.从x点回来:直接跑一遍从x点出发的最短路就能获得x点到其他所有点的最短路。
2.各点出发去x点,也可以看成从x点倒退会各点最短路,因为边时有向的,所以输入时再多加一个反向建图的数据,
从x出发跑一遍方向建图的数据即可获得各点到x点的最短路。
代码:
#include <iostream>
#include <cstring>
#define fastio ios::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL)
#define debug(a) cout << "debug : " << (#a) << " = " << a << endl
using namespace std;
typedef long long ll;
typedef pair<ll, ll> PII;
const int N = 1010;
const int INF = 0x3f3f3f3f;
const double eps = 1e-6;
const int mod = 998244353;
int n, m, x;
int a[2][N][N];
bool vis[N];
int dis[2][N];
void dijkstra(int k)
{
memset(dis[k], INF, sizeof dis[k]);
memset(vis, false, sizeof vis);
dis[k][x] = 0;
for (int i = 1; i <= n; i++)
{
int t = -1;
for (int j = 1; j <= n; j++)
{
if (!vis[j] && (t == -1 || dis[k][j] < dis[k][t])) //这个括号内括号非常重要,一定不能漏掉,不然出bug
t = j;
}
vis[t] = true;
for (int j = 1; j <= n; j++)
dis[k][j] = min(dis[k][j], dis[k][t] + a[k][t][j]);
}
}
int main()
{
cin >> n >> m >> x;
memset(a, INF, sizeof a);
for (int i = 1; i <= m; i++)
{
int l, r, w;
cin >> l >> r >> w;
a[0][l][r] = w, a[1][r][l] = w;
}
dijkstra(0);
dijkstra(1);
int ans = 0;
int idx;
for (int i = 1; i <= n; i++)
{
if (ans < dis[0][i] + dis[1][i])
ans = dis[0][i] + dis[1][i], idx = i;
}
cout << ans << endl;
return 0;
}