题面:https://www.luogu.org/problem/P1119 本题可以枚举已重建好的中转点,然后跑floyd即可.注意:这里的重建时间t是按照从小到大时间给出的,所以无需排序了.Code:#includeiostream#includecstdio#includecs
题面:https://www.luogu.org/problem/P1119
本题可以枚举已重建好的中转点,然后跑floyd即可. 注意:这里的重建时间t是按照从小到大时间给出的,所以无需排序了. Code: #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<ctime> using namespace std; const int N=205,M=50005,INF=0x3f3f3f3f; int n,m,dis[N][N],t[M],q,k=1; int main(){ scanf("%d%d",&n,&m); memset(dis,INF,sizeof(dis)); for(int i=1;i<=n;i++){ scanf("%d",&t[i]); } for(int i=1;i<=m;i++){ int u,v,w; scanf("%d%d%d",&u,&v,&w); u++,v++; dis[u][v]=dis[v][u]=w; } scanf("%d",&q); while(q--){ int u,v,t1; scanf("%d%d%d",&u,&v,&t1); u++,v++; while(t[k]<=t1&&k<=n){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]); } } k++; } if(dis[u][v]==INF||t[u]>t1||t[v]>t1){ printf("-1\n"); } else{ printf("%d\n",dis[u][v]); } } return 0; }