1 条题解

  • 0
    @ 2026-6-17 0:45:13

    // 最短路+点权限制 Floyd 算法 O(n^3+q)
    #include<bits/stdc++.h>
    #define N 205
    using namespace std;
    
    int n,m,q,a[N],k=0;
    int d[N][N];
    
    void Floyd(int t){
      for(;a[k]<=t && k<n;k++) //枚举权值≤t的插点
      for(int i=0;i<n;i++)
      for(int j=0;j<n;j++)
      if(d[i][j]>d[i][k]+d[j][k])
        d[i][j]=d[j][i]=d[i][k]+d[j][k];
    }
    int main(){
      cin>>n>>m;
      for(int i=0;i<n;i++)scanf("%d",a+i);
      for(int i=0;i<n;i++)for(int j=0;j<n;j++)d[i][j]=1e9;
      for(int i=0;i<n;i++)d[i][i]=0;
      for(int i=1,u,v,w; i<=m; i++){
        scanf("%d%d%d",&u,&v,&w);
        d[u][v]=d[v][u]=w;
      }
      cin>>q;
      for(int i=1,u,v,t; i<=q; i++){
        scanf("%d%d%d",&u,&v,&t);
        Floyd(t); //最短路
        if(a[u]>t || a[v]>t) cout<<-1<<"\n"; //无插点情况
        else{
          if(d[u][v]==1e9) cout<<-1<<"\n";
          else cout<<d[u][v]<<"\n";
        }
      }
    }
    
    • 1

    D108 最短路 Floyd 算法 灾后重建

    信息

    ID
    12497
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    8
    已通过
    3
    上传者