P1119 灾后重建
P1119灾后重建题解
看到这道题,非常简单地想到方法\(Floyd\)
然后直接实现:
中间加入几个判断,判断路径能否通过即可。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;
const int maxn=205;
#define inf 0x3f3f3f3f
const int maxx=1e9+7;
int t[maxn],dis[maxn][maxn];
int main(){
memset(t,0x3f,sizeof t);
int n,m;scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
scanf("%d",&t[i]);
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
dis[i][j]=100005;
}
}
for(int i=0;i<m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
dis[u][v]=w;dis[v][u]=w;
}
int q;scanf("%d",&q);
int now=0;
while(q--){
int x,y,ask;
scanf("%d%d%d",&x,&y,&ask);
for(;t[now]<=ask;now++){//试图降低复杂度
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i==j)continue;
dis[i][j]=min(dis[i][j],dis[i][now]+dis[now][j]);
}
}
}
if(dis[x][y]>100000||t[x]>ask||t[y]>ask)printf("-1\n");
else printf("%d\n",dis[x][y]);
}
return 0;
}
挺简单的,一会出\(Floyd\)