传送门:https://www.luogu.org/problemnew/show/P1119
我:这什么辣鸡算法啊,O(n^3)能用?敲dijkstra啊!
我:?TLE???
:写个Floyd啊!
我:我才不写这个垃圾O(n^3)
评测鸡:Accepted!
我:哎呦真香。
这题用dijkstra每次跑一遍,第一次50分,改了改scanf,跑了60分,改了改printf,开了O2,跑了80分,改了改memset,还是80分,看来dijkstra到头了...
这题是q次询问,而且是多源最短路,而且每次询问的时间都是递增的,所以那就直接Floyd就好啦。
哎呦真香。
Floyd大家肯定都会吧,大概就是DP思想。
上代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 210;
const int INF = 1e9+7;
int d[maxn][maxn];
int t[maxn];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n,m;
cin>>n>>m;
memset(d,0x7f,sizeof(d));
for(int i=0;i<n;i++)
{
cin>>t[i];
}
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=1;i<=m;i++)
{
int x,y,z;
cin>>x>>y>>z;
d[x][y] = z;
d[y][x] = z;
}
int q;
int p = 0;
cin>>q;
for(int i=0;i<q;i++)
{
int x,y,z;
cin>>x>>y>>z;
for(;t[p]<=z && p<n;p++)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
d[i][j] = min(d[i][j],d[i][p]+d[p][j]);
}
}
}
if(t[x]>z || t[y]>z || d[x][y]>=INF) cout<<"-1"<<endl;
else cout<<d[x][y]<<endl;
}
return 0;
}