JSCPC/GDCPC 2025 J.Puzzle Competition(解谜游戏)
题目链接:Puzzle Competition - 题目 - QOJ.ac,或 Problem - J - Codeforces
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<vector>
#include<queue>
#include<deque>
#include<stack>
#include<set>
#include<map>
#include<unordered_set>
#include<unordered_map>
#include<bitset>
#include<tuple>
#define inf 72340172838076673
#define int long long
#define endl '\n'
#define F first
#define S second
#define mst(a,x) memset(a,x,sizeof (a))
using namespace std;
typedef pair<int, int> pii;const int N = 1000086, mod = 998244353;
int h[N], ne[N], e[N], w[N], idx;
int n, m, k;
int a[N];
int dis[N];
priority_queue<pii, vector<pii>, greater<pii >> q;
priority_queue<int> tp[N];
bool st[N];void add(int a, int b, int c) {w[idx] = c;e[idx] = b;ne[idx] = h[a];h[a] = idx++;
}void dij() {while (q.size()) {auto[d, u] = q.top();q.pop();if (st[u]) continue;st[u] = true;for (int i = h[u]; ~i; i = ne[i]) {int j = e[i];tp[j].push(d + w[i]);if (tp[j].size() >= a[j]) {int t = tp[j].top();tp[j].pop();dis[j] = min(dis[j], t);q.push({dis[j], j});}}}}void solve() {cin >> n >> m >> k;for (int i = 1; i <= n; i++) {cin >> a[i];dis[i] = inf;if (!a[i]) {dis[i] = 0;q.push({0, i});}}for (int i = 1; i <= k; i++) {int t, sc;cin >> t >> sc;for (int j = 1; j <= sc; j++) {int x;cin >> x;dis[x] = min(dis[x], t);q.push({dis[x], x});}}mst(h, -1);for (int i = 1; i <= m; i++) {int a, b, c;cin >> a >> b >> c;if (!c) continue;add(a, b, c);}dij();for (int i = 1; i <= n; i++) {if (dis[i] < inf / 2) cout << dis[i] << " ";else cout << -1 << " ";}}signed main() {ios::sync_with_stdio(false);cin.tie(nullptr), cout.tie(nullptr);int T = 1;
// cin >> T;while (T--) solve();return 0;
}