P1119 灾后重建
P1119 灾后重建
突然发现模拟赛考过这题。。。
大抵就是按时间更新,floyd每次更新一个点,大概是
/*
Name:
Author: Gensokyo_Alice
Date:
Description:
*/
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <ctime>
#include <stack>
#include <queue>
#include <set>
#include <map>
using namespace std;
typedef long long ll;
const ll MAXN = (1LL << 20) + 10, INF = 0x3f3f3f3f3f3f3f3f;
template<typename T> void read(T& x) {
char s = getchar(); x = 0; long long f = 1;
for (; !isdigit(s); s = getchar()) if (s == '-') f = -1;
for (; isdigit(s); s = getchar()) x = 10 * x + (s - '0');
x *= f;
}
ll N, M, Q, f[210][210], tim[MAXN], head[MAXN], cnt = -1, dfn[MAXN];
struct edge {
ll x, y, v;
} e[MAXN];
struct edg {
ll nt, to, v;
} E[MAXN];
struct que {
ll x, y, tim;
friend bool operator < (que a, que b) {return a.tim < b.tim;}
} q[MAXN];
void debug() {
for (ll i = 1; i <= N; i++, puts(""))
for (ll j = 1; j <= N; j++)
if (f[i][j] != INF) printf("%lld ", f[i][j]);
else printf("%lld ", -1LL);
}
int main() {
memset(tim, 0x3f, sizeof(tim));
memset(f, 0x3f, sizeof(f));
memset(head, -1, sizeof(head));
read(N); read(M);
for (ll i = 1; i <= N; i++) read(tim[i]), dfn[i] = i, f[i][i] = 0;
for (ll i = 1; i <= M; i++) read(e[i].x), e[i].x++, read(e[i].y), e[i].y++, read(e[i].v), f[e[i].x][e[i].y] = f[e[i].y][e[i].x] = min(f[e[i].x][e[i].y], e[i].v);
read(Q);
for (ll i = 1; i <= Q; i++) read(q[i].x), q[i].x++, read(q[i].y), q[i].y++, read(q[i].tim);
for (ll i = 1, l = 1; i <= Q; i++) {
while (l <= N && tim[dfn[l]] <= q[i].tim) {
ll now = dfn[l];
for (ll i = 1; i <= N; i++)
for (ll j = 1; j <= N; j++)
if (i != j && i != now && j != now)
f[i][j] = min(f[i][j], f[i][now] + f[now][j]);
l++;
//debug();
}
if (f[q[i].x][q[i].y] >= INF || tim[q[i].x] > q[i].tim || tim[q[i].y] > q[i].tim) puts("-1");
else printf("%lld\n", f[q[i].x][q[i].y]);
}
return 0;
}