集训第一周周末训练的迪杰斯特拉,求来回某点的最长时间,路是单向的,于是我把它做成从该点出发,用两种路走两遍
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cctype>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
const int NNN = 9999999;
const int NN = 1050;
int road[NN][NN];
int road2[NN][NN];
int dis[NN];
int vis[NN];
int N, M, K;
int DDD[NN];
void DIS(int x,int road[NN][NN])
{
int i;
int j;
int ans;
int v;
ans = NNN;
dis[x] = 0;
vis[x] = 1;
for (i = 1; i <= N; i++)
dis[i] = road[x][i];
for (j = 1; j <= N; j++)
{
ans = NNN;
for (i = 1; i <= N; i++)
{
if (dis[i] < ans && !vis[i])
{
ans = dis[i];
v = i;
}
}
vis[v] = 1;
for (i = 1; i <= N; i++)
{
dis[i] = min(dis[i], dis[v] + road[v][i]);
}
}
}
int main()
{
int i, j;
int a, b;
int x, y;
while (cin >> N)
{
a = b = x = y = 0;
memset(dis, NNN, sizeof(dis));
memset(vis, 0, sizeof(vis));
memset(DDD, 0, sizeof(DDD));
for (i = 0; i < NN; i++)
for (j = 0; j < NN; j++)
{
if (i != j)
{
road[i][j] = NNN;
road2[i][j] = NNN;
}
else
{
road[i][j] = 0;
road2[i][j] = 0;
}
}
cin >> M >> y;
for (i = 0; i < M; i++)
{
cin >> a >> b;
cin >> road[a][b];
road2[b][a] = road[a][b];
}
memset(dis, NNN, sizeof(dis));
memset(vis, 0, sizeof(vis));
DIS(y,road);
for (i = 1; i <= N; i++)
if (i != y)
{
DDD[i] += dis[i];
}
memset(dis, NNN, sizeof(dis));
memset(vis, 0, sizeof(vis));
DIS(y, road2);
for (i = 1; i <= N; i++)
if (i != y)
{
DDD[i] += dis[i];
// cout << i << " " << DDD[i] << endl;
// cout << dis[i] << endl;
}
DDD[y] = 0;
sort(DDD + 1, DDD + 1 + N);
cout << DDD[N] << endl;
}
return 0;
}