洛谷P1119 灾后重建

传送门

题目大意:点被破坏,t[i]为第i个点修好的时间,且t[1]<t[2]<t[3]..

若干询问,按时间排序,询问第t时刻,u,v的最短路径长度。

题解:floyed

根据时间加入点去松弛其他点

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 210
#define inf 0x7fff
using namespace std;
int n,m,q;
int t[N];
int map[N][N];
int main()
{
    cin>>n>>m;
    for(int i=0;i<n;i++)
    for(int j=0;j<n;j++)
    map[i][j]=inf*(i!=j);
    for (int i = 0; i < n; ++i)
        scanf("%d",&t[i]);
    t[n]=inf;
    for (int i = 0; i < m; ++i)
    {
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        map[x][y]=z;
        map[y][x]=z;
    }
   scanf("%d",&q);
    int u=0;
    for (int i = 0; i < q; ++i)
    {
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        while(t[u]<=z)
        {
            for(int i=0;i<n;i++)
                for(int j=0;j<n;j++)
                    map[i][j]=min(map[i][j],map[i][u]+map[u][j]);
            u++;
        }
        if(t[x]>z||t[y]>z||map[x][y]==inf)
            puts("-1");
        else
            printf("%d
",map[x][y]);
    }
    return 0;
}
AC
原文地址:https://www.cnblogs.com/zzyh/p/7711784.html