题解:P15716 [JAG 2023 Summer Camp #2] Drifting
要求
首先你注意到一个很隐蔽的事情,题目保证了
因为有
现在将全部有用的信息记下来后,就可以自然的将
但是这样太慢了,原因也很简单。我们在每次转移到
#include <bits/stdc++.h>
#define ull unsigned long long
#define int long long
#define fi first
#define se second
#define pb emplace_back
#define mk make_pair
using namespace std;
typedef pair<int, int> pii;
const int N = 2e5 + 10, inf = 1e18, M = 2e6 + 10, mod = 1e9 + 7;
const double eps = 1e-8;
int n, m, head[N], ne[N << 1], to[N << 1], w[N << 1], id;
void add(int x, int y, int z) {
to[++id] = y, ne[id] = head[x], head[x] = id, w[id] = z;
}
map<pair<pii, int>, bool> mp;
struct node { int u, dis, ls; };
int q[N], ql = 1, qr = 0, in[N];
vector<pii> dis[N];
void dijkstra() {
for(int i = 1; i <= n; i++) {
if(!in[i]) q[++qr] = i, dis[i].pb(mk((i == 1 ? 0 : inf), -1));
}
while(ql <= qr) {
int u = q[ql++];
sort(dis[u].begin(), dis[u].end());
for(int i = head[u]; i; i = ne[i]) {
int v = to[i]; in[v]--;
for(int j = 0; j < dis[u].size(); j++) {
pii now = dis[u][j];
if(mp.count(mk(mk(now.se, u), v))) continue;
dis[v].pb(mk(now.fi + w[i], u));
break;
}
if(!in[v]) q[++qr] = v;
}
}
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> m;
for(int i = 1; i <= m; i++) {
int x, y, z; cin >> x >> y >> z;
add(x, y, z), in[y]++;
}
int K; cin >> K;
for(int i = 1; i <= K; i++) {
int x, y, z; cin >> x >> y >> z;
mp[mk(mk(x, y), z)] = 1;
}
dijkstra();
int mn = inf;
for(auto now : dis[n]) mn = min(mn, now.fi);
cout << (mn == inf ? -1 : mn) << "\n";
return 0;
}