题目:https://www.luogu.org/problemnew/show/P1119
Floyd裸题……何况每个点的完成时间和查询中的时间都是单调不降的。
如果Q遍djkstra、访问过程中根据edge[i].to的 t 来判断能不能走的话……不管了。
Floyd之前尽管t=0时有点没建好,还是要把边权赋成初值,而且用别的k的时候也还是要更新这些还没建好的点;只是输出的时候判断一下就行了。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const int N=205,M=200*199/2+5; const ll INF=795741901218843403; int n,m,q,t[N],cur; ll f[N][N]; int main() { memset(f,11,sizeof f); scanf("%d%d",&n,&m);int x,y,z; for(int i=0;i<n;i++)scanf("%d",&t[i]); for(int i=1;i<=m;i++) { scanf("%d%d%d",&x,&y,&z); f[x][y]=f[y][x]=z;// } scanf("%d",&q);cur=-1; while(q--) { scanf("%d%d%d",&x,&y,&z); while(1) { if(t[cur+1]>z||cur+1>n)break;cur++; for(int i=0;i<n;i++) for(int j=0;j<n;j++) f[i][j]=min(f[i][j],f[i][cur]+f[cur][j]); } if(t[x]>z||t[y]>z||f[x][y]==INF)printf("-1 "); else printf("%lld ",f[x][y]); } return 0; }