P1119 灾后重建
floyd最短路题目,不过要深刻意识floyd算法的本质才行
简单的来说,floyd本质就是枚举每一个点作为中转点来尝试优化两个点的距离.
而第一维枚举的k就是我们要尝试用的中转点.
#include<bits/stdc++.h> #define ll long long using namespace std; const int N=210; int dis[N][N],n,m,t[N],now,q; inline int read() { int x=0,ff=1; char ch=getchar(); while(!isdigit(ch)) {if(ch=='-') ff=-1;ch=getchar();} while(isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} return x*ff; } inline void update(int k) { for(int i=0;i<n;++i) for(int j=0;j<n;++j) if(dis[i][j]>dis[i][k]+dis[k][j]) dis[i][j]=dis[j][i]=dis[i][k]+dis[k][j]; } int main() { freopen("1.in","r",stdin); n=read();m=read(); memset(dis,0x3f,sizeof(dis)); for(int i=0;i<n;++i) t[i]=read(); for(int i=0;i<n;++i) dis[i][i]=0; for(int i=1;i<=m;++i) { int x=read(),y=read(); dis[x][y]=dis[y][x]=read(); } q=read(); for(int l=1;l<=q;++l) { int x=read(),y=read(),time=read(); while(now<n&&t[now]<=time) { update(now); ++now; } if(t[x]>time||t[y]>time) cout<<-1<<endl; else { if(dis[x][y]==0x3f3f3f3f) cout<<-1<<endl; else cout<<dis[x][y]<<endl; } } return 0; }