【Luogu】P1119灾后重建(Floyd)

  题目链接

  见题解: feilongz。

  这里只放代码。

  

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
inline long long read(){
    long long num=0,f=1;
    char ch=getchar();
    while(!isdigit(ch)){
        if(ch=='-')    f=-1;
        ch=getchar();
    }
    while(isdigit(ch)){
        num=num*10+ch-'0';
        ch=getchar();
    }
    return num*f;
}

int Map[200][200];
bool vis[200];
int tme[200];


int main(){
    int n=read(),m=read();
    memset(Map,127/3,sizeof(Map));
    for(int i=0;i<n;++i){
        tme[i]=read();
        Map[i][i]=0;
    }
    for(int i=1;i<=m;++i){
        int from=read(),to=read(),dis=read();
        if(Map[from][to]>dis)    Map[from][to]=Map[to][from]=dis;
    }
    int Q=read();
    for(int i=1;i<=Q;++i){
        int from=read(),to=read(),t=read();
        for(int j=0;j<n;++j){
            if(vis[j]||tme[j]>tme[to])    continue;
            vis[j]=1;
            for(int k=0;k<n;++k)
                for(int l=0;l<n;++l)
                    if(Map[k][l]>Map[k][j]+Map[j][l])    Map[k][l]=Map[k][j]+Map[j][l];
        }
        if(tme[from]>t||tme[to]>t||Map[from][to]==Map[n][n]){
            printf("-1
");
            continue;
        }
        printf("%d
",Map[from][to]);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/cellular-automaton/p/7613918.html