P1119 灾后重建

dij会tle

用floyd 

因为保证t递增

所以边松弛边求解

//P1119 灾后重建
#include<bits/stdc++.h>
using namespace std;
const int inf=987654321;
const int mxn=205;
const int mxm=20005;
int d[mxn][mxn],f[mxm];
int n,m;
inline int read(){
    int k=0;
    char c;
    c=getchar();
    while(!isdigit(c)) c=getchar();
    while(isdigit(c)){
        k=(k<<1)+(k<<3)+(c^48);
        c=getchar();
    }
    return k;
}
int main(){
    int x,y,z;
    n=read();
    m=read();
    for(int i=0;i<=n;i++){
        for(int j=0;j<=n;j++){
            d[i][j]=inf;
        }
        f[i]=inf;
    }
    for(int i=0;i<n;i++){
        f[i]=read();
        d[i][i]=0;
    }
    for(int i=1;i<=m;i++){
        x=read(),y=read(),z=read();
        d[x][y]=d[y][x]=z;
    }
    int q,k=0;
    cin>>q;
    while(q--){
        x=read(),y=read(),z=read();
        while(f[k]<=z){
            for(int i=0;i<n;i++){
                for(int j=0;j<n;j++){
                    d[i][j]=min(d[i][j],d[i][k]+d[k][j]); 
                }
            }
            k++;
        }
        if(d[x][y]==inf||f[x]>z||f[y]>z) puts("-1");
        else printf("%d
",d[x][y]);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/duojiaming/p/11818123.html