P1119 灾后重建

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\)

posted @ 2020-10-09 15:56  Luo_Feng_Han  阅读(112)  评论(0编辑  收藏  举报