P1119 灾后重建
dij会tle
用floyd
因为保证t递增
所以边松弛边求解
//P1119 灾后重建 #include<bits/stdc++.h> using namespace std; const int inf=987654321; const int mxn=205; const int mxm=20005; int d[mxn][mxn],f[mxm]; int n,m; inline int read(){ int k=0; char c; c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)){ k=(k<<1)+(k<<3)+(c^48); c=getchar(); } return k; } int main(){ int x,y,z; n=read(); m=read(); for(int i=0;i<=n;i++){ for(int j=0;j<=n;j++){ d[i][j]=inf; } f[i]=inf; } for(int i=0;i<n;i++){ f[i]=read(); d[i][i]=0; } for(int i=1;i<=m;i++){ x=read(),y=read(),z=read(); d[x][y]=d[y][x]=z; } int q,k=0; cin>>q; while(q--){ x=read(),y=read(),z=read(); while(f[k]<=z){ for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ d[i][j]=min(d[i][j],d[i][k]+d[k][j]); } } k++; } if(d[x][y]==inf||f[x]>z||f[y]>z) puts("-1"); else printf("%d\n",d[x][y]); } return 0; }