【luogu1119】灾后重建(加强版Floyd)

来源:互联网 发布:城市交通综合网络规划 编辑:程序博客网 时间:2024/06/06 05:52

题目:

我是超链接

题解:

加一个村庄就把这个村庄当成中转修改一下之前的最短路,0x3f是我认识的第三个很大的数

代码:

#include <cstdio>#include <algorithm>#include <iostream>#include <cstring>using namespace std;struct hh{    int x,y,t;}xx[50005];int f[205][205],t[205];int main(){    int n,m,i,Q,a,b,c,k,j,ii;    scanf("%d%d",&n,&m);    for (i=1;i<=n;i++)      scanf("%d",&t[i]);    memset(f,0x3f,sizeof(f));      for (i=1;i<=m;i++)    {        scanf("%d%d%d",&a,&b,&c);a++;b++;        f[a][b]=f[b][a]=c;    }    scanf("%d",&Q);int QQ=Q;i=1;    while (Q--)    {        scanf("%d%d%d",&xx[i].x,&xx[i].y,&xx[i].t);        xx[i].x++; xx[i].y++;i++;    }    int zl=1,sj=1;        for (k=1;k<=n;k++)    {        f[k][k]=0;        while (sj<=QQ && xx[sj].t<t[k])//建这个村庄之前的可以输出了         {            if (f[xx[sj].x][xx[sj].y]>1061109565 || xx[sj].x>=k || xx[sj].y>=k) printf("-1\n");            else printf("%d\n",f[xx[sj].x][xx[sj].y]);            sj++;        }        if (sj>QQ) break;        for (i=1;i<=n;i++)//虽然这个村庄没有修好,但是最短路还是要修改的,因为k以后就不当中转了           for (j=1;j<=n;j++)            f[i][j]=min(f[i][j],f[i][k]+f[k][j]);          }    while (sj<=QQ)     {        if (f[xx[sj].x][xx[sj].y]>1061109565) printf("-1\n");        printf("%d\n",f[xx[sj].x][xx[sj].y]);        sj++;    }    }