洛谷1119灾后重建

题目:https://www.luogu.org/problemnew/show/P1119

Floyd裸题……何况每个点的完成时间和查询中的时间都是单调不降的。

如果Q遍djkstra、访问过程中根据edge[i].to的 t 来判断能不能走的话……不管了。

Floyd之前尽管t=0时有点没建好,还是要把边权赋成初值,而且用别的k的时候也还是要更新这些还没建好的点;只是输出的时候判断一下就行了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=205,M=200*199/2+5;
const ll INF=795741901218843403;
int n,m,q,t[N],cur;
ll f[N][N];
int main()
{
    memset(f,11,sizeof f);
    scanf("%d%d",&n,&m);int x,y,z;
    for(int i=0;i<n;i++)scanf("%d",&t[i]);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        f[x][y]=f[y][x]=z;//
    }
    scanf("%d",&q);cur=-1;
    while(q--)
    {
        scanf("%d%d%d",&x,&y,&z);
        while(1)
        {
            if(t[cur+1]>z||cur+1>n)break;cur++;
            for(int i=0;i<n;i++)
                for(int j=0;j<n;j++)
                    f[i][j]=min(f[i][j],f[i][cur]+f[cur][j]);
        }
        if(t[x]>z||t[y]>z||f[x][y]==INF)printf("-1\n");
        else printf("%lld\n",f[x][y]);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Narh/p/8922339.html