第一种方法进floyd函数前每处理一个村庄,将这个点做中转放进函数更新距离;第二种方法是进到floyd1函数里面,然后根据给的时间求可以路过那些村庄,最后一块更新距离,但是会TLE,不知道为什么。
#include<iostream>
using namespace std;
#include<algorithm>
#include<vector>
#include<queue>
#include<climits>
#include<cstring>
#include<cmath>
#define inf 0x3f3f3f3f
const int N = 210;
int d[N][N], f[N][N], c[N];
int n, m, u, v, w, q;
int x, y, t, ans, pos;
void floyd(int k)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
}
}
}
void floyd1()
{
int num = 0;
while (c[num] <= t && num < n)//找可以走的村庄
{
num++;
}
for (int k = 0; k < num; k++)//用可以走的村庄做中转点更新距离
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> n >> m;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
d[i][j] = inf;
}
d[i][i] = 0;
}
for (int i = 0; i < n; i++)
{
cin >> c[i];
}
for (int i = 1; i <= m; i++)
{
cin >> u >> v >> w;
d[u][v] = w;
d[v][u] = w;
}
cin >> q;
for (int i = 1; i <= q; i++)
{
cin >> x >> y >> t;
while (c[pos] <= t && pos < n)//如果目前更新的点的村庄修完时间在询问时间之前
{
floyd(pos);
pos++;
}
if (c[x] > t || c[y] > t)//村庄未建好
{
cout << -1 << endl;
continue;
}
/*floyd1();*/
if (d[x][y] != inf)
{
cout << d[x][y] << endl;
}
else
{
cout << -1 << endl;
}
}
return 0;
}