洛谷P1119 災後重建 題解
阿新 • • 發佈:2021-01-08
災後重建 - 洛谷
description:
一共
個村莊,每個村莊有一個通車時間 。有 條雙向邊。有 個詢問,每次詢問一組 ,表示第 天時 之間的最短路徑。solution:
看到資料範圍較小,直接
即可。每次把當前能夠修建好的邊加入所有
個點的中轉點中,,,給定的通車時間和每次的詢問都按照時間推移,這是好的,直接做就行了。
code:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int f[1005][1005];
int a[20005];
int main()
{
memset(f,0x3f,sizeof(f));
memset(a,0x3f,sizeof(a));
int n,m;
scanf("%d%d",&n,&m);
/*for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
f[i][j]=2147483640;
}
}*/
for(int i=1;i<=n;i++)
{
scanf("%d" ,&a[i]);
f[i][i]=0;
}
for(int i=1;i<=m;i++)
{
int x,y,v;
scanf("%d%d%d",&x,&y,&v);
x++;
y++;
f[x][y]=f[y][x]=v;
}
int q,x,y,t;
scanf("%d",&q);
int k=1;
while(q--)
{
//int k=0;
scanf("%d%d%d",&x,&y,&t);
x++;
y ++;
while(a[k]<=t)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
f[i][j]=min(f[i][k]+f[k][j],f[i][j]);
}
}
k++;
}
if(f[x][y]==0x3f3f3f3f||a[x]>t||a[y]>t)
{
printf("-1\n");
}
else
{
printf("%lld\n",f[x][y]);
}
}
return 0;
}