洛谷P1119 灾后重建
题目大意:点被破坏,t[i]为第i个点修好的时间,且t[1]<t[2]<t[3]..
若干询问,按时间排序,询问第t时刻,u,v的最短路径长度。
题解:floyed
根据时间加入点去松弛其他点
代码:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 210 #define inf 0x7fff using namespace std; int n,m,q; int t[N]; int map[N][N]; int main() { cin>>n>>m; for(int i=0;i<n;i++) for(int j=0;j<n;j++) map[i][j]=inf*(i!=j); for (int i = 0; i < n; ++i) scanf("%d",&t[i]); t[n]=inf; for (int i = 0; i < m; ++i) { int x,y,z; scanf("%d%d%d",&x,&y,&z); map[x][y]=z; map[y][x]=z; } scanf("%d",&q); int u=0; for (int i = 0; i < q; ++i) { int x,y,z; scanf("%d%d%d",&x,&y,&z); while(t[u]<=z) { for(int i=0;i<n;i++) for(int j=0;j<n;j++) map[i][j]=min(map[i][j],map[i][u]+map[u][j]); u++; } if(t[x]>z||t[y]>z||map[x][y]==inf) puts("-1"); else printf("%d\n",map[x][y]); } return 0; }