P1119 灾后重建

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;
}
View Code

 

posted @ 2020-03-20 20:33  逆天峰  阅读(108)  评论(0编辑  收藏  举报
作者:逆天峰
出处:https://www.cnblogs.com/gcfer//