1 条题解
-
0

// 最短路+点权限制 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
信息
- ID
- 12497
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 8
- 已通过
- 3
- 上传者