fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxN=510;
  4. const int maxQ=2e5+1;
  5. const int INF=1e9;
  6.  
  7. int def[maxN],dp[maxN][maxN],idx[maxN];//機場防禦力高到低
  8. int qry[maxQ][3],ans[maxQ],ord[maxQ];//查詢暴動指數高到低
  9. bool comp(int lhs, int rhs){
  10. return qry[lhs][0]>qry[rhs][0];
  11. }
  12. int main(){
  13. int N, M, Q, u, v, c;
  14. cin>>N>>M>>Q;
  15. for(int i=1; i<=N; i++)
  16. cin>>def[i];
  17. for(int i=1; i<=N; i++)
  18. for(int j=1; j<=N; j++)
  19. dp[i][j]=INF;
  20. for(int i=1; i<=M; i++){
  21. cin>>u>>v>>c;
  22. dp[u][v]=dp[v][u]=min(dp[u][v],c);
  23. }
  24. for(int q=1; q<=Q; q++)
  25. cin>>qry[q][0]>>qry[q][1]>>qry[q][2];
  26.  
  27. iota(ord+1,ord+1+Q,1);
  28. sort(ord+1,ord+1+Q,comp);
  29. iota(idx+1,idx+1+N,1);//防禦力
  30. sort(idx+1,idx+1+N,[](int lhs, int rhs){
  31. return def[lhs]>def[rhs];
  32. });
  33. //for(int i=1; i<=N; i++)
  34. // cout<<idx[i]<<' ';
  35.  
  36. for(int n=1, q=1; q<=Q; q++){
  37. int qID=ord[q];
  38. for(; n<=N and def[idx[n]]>=qry[qID][0]; n++){
  39. int m=idx[n];
  40. for(int s=1; s<=N; s++)
  41. for(int e=1; e<=N; e++)
  42. dp[s][e]=min(dp[s][e],dp[s][m]+dp[m][e]);
  43. }
  44. u=qry[qID][1], v=qry[qID][2];
  45. ans[qID]=(def[u]>=qry[qID][0] and def[v]>=qry[qID][0] and dp[u][v]<INF)?dp[u][v]:-1;
  46. }
  47. for(int q=1; q<=Q; q++)
  48. cout<<ans[q]<<'\n';
  49.  
  50. /*for(int i=1; i<=N; i++){
  51. for(int j=1; j<=N; j++)
  52. cout<<(dp[i][j]==INF? 0:dp[i][j])<<' ';
  53. cout<<'\n';
  54. }*/
  55. }
Success #stdin #stdout 0.01s 5576KB
stdin
6 5 5
5 4 1 3 2 6
1 3 3
1 4 1
2 4 6
2 5 1
3 5 2
1 1 2
2 1 2
3 1 2
4 1 2
1 5 3
stdout
6
7
7
-1
2