多源最短路+Floyd真香【洛谷P1119】
阿新 • • 發佈:2018-11-21
傳送門: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; }