Untitled
unknown
plain_text
a year ago
2.5 kB
10
Indexable
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
template<class T> using ordered_multiset = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;
template<typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
using namespace std;
#define ll long long
#define sz(x) (int)x.size()
int dx8[] = {1, -1, 0, 0, 1, -1, -1, 1};
int dy8[] = {0, 0, 1, -1, 1, -1, 1, -1};
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
string dir = "RLDU";
const ll N = 1e5 + 2, M = 900 + 2, MOD = 1e9 + 7, inf = 3e18, inf2 = 1e9;
int n, m, q;
vector<vector<pair<int, ll>>> adj1, adj2;
vector<int> to_sort1, to_sort2;
vector<bool> vis1, vis2;
void dfs(int node, int parent, vector<vector<pair<int, ll>>> &adj, vector<int> &to_sort, vector<bool> &vis) {
vis[node] = 1;
for (auto it: adj[node]) {
if (it.first == parent or vis[it.first])continue;
dfs(it.first, node, adj, to_sort, vis);
}
to_sort.push_back(node);
}
void code() {
cin >> n >> m >> q;
adj1 = vector<vector<pair<int, ll>>>(n + 5);
adj2 = vector<vector<pair<int, ll>>>(n + 5);
vis1 = vector<bool>(n + 5, 0);
vis2 = vector<bool>(n + 5, 0);
for (int i = 0; i < m; i++) {
int u, v;
ll w;
cin >> u >> v >> w;
adj1[u].push_back({v, w});
adj2[v].push_back({u, w});
}
vector<vector<ll>> dp(2, vector<ll>(n + 5, -1));
dfs(1, 1, adj1, to_sort1, vis1);
dfs(n, 1, adj2, to_sort2, vis2);
reverse(to_sort1.begin(), to_sort1.end());
dp[0][to_sort1[0]] = 0;
for (auto i: to_sort1) {
for (auto it: adj1[i]) {
dp[0][it.first] = max(dp[0][it.first], dp[0][i] + it.second);
}
}
reverse(to_sort2.begin(), to_sort2.end());
dp[1][to_sort2[0]] = 0;
for (auto i: to_sort2) {
for (auto it: adj2[i]) {
dp[1][it.first] = max(dp[1][it.first], dp[1][i] + it.second);
}
}
while (q--) {
int node;
cin >> node;
if (dp[0][node] == -1 or dp[1][node] == -1)
cout << "-1\n";
else
cout << dp[0][node] + dp[1][node] << '\n';
}
}
/*
7 9 3
1 2 5
1 3 6
1 4 7
2 5 1
2 6 8
5 7 2
6 7 1
3 2 1
3 7 12
2
3
4
*/
signed main() {
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
int tes = 1;
// cin >> tes;
for (int i = 1; i <= tes; ++i) {
code();
}
}Editor is loading...
Leave a Comment