#include <cstdio> #include <queue> #include <set> #include <vector> const long long MAX_POWER = 1 << 30; using namespace std; using power_type = long long; struct Node { int id = 0; vector<pair<Node *, power_type>> connections; set<power_type> seen_powers; power_type _max_power = 0; power_type min_multiplier = MAX_POWER; power_type graph_max_power = 0; power_type max_power() { return min(_max_power, graph_max_power); } }; struct Graph { vector<Node> nodes; power_type result = -1; void dijkstra() { priority_queue<pair<power_type, Node *>, vector<pair<power_type, Node *>>, greater<pair<power_type, Node *>>> pq; nodes[nodes.size() - 1].min_multiplier = 1; pq.push({1, &nodes[nodes.size() - 1]}); while (!pq.empty()) { // power_type weight = pq.top().first; Node *u = pq.top().second; pq.pop(); for (auto &connection : u->connections) { auto [v, weight] = connection; power_type new_weight = u->min_multiplier * weight; // printf("u: %d v: %d nw: %lld\n", u->id, v->id, new_weight); if (v->min_multiplier > new_weight) { v->min_multiplier = new_weight; pq.push({new_weight, v}); } } } } void dfs(Node *current_node, power_type current_power) { if (current_node->id == nodes.size() - 1) { result = max(result, current_power); } current_node->seen_powers.insert(current_power); for (auto &connection : current_node->connections) { auto [node, power] = connection; power_type new_power = current_power * power; // printf("cn: %d nn: %d np: %lld mp: %lld \n", current_node->id, node->id, // new_power, node->max_power()); if (new_power <= node->max_power() && !node->seen_powers.contains(new_power)) { dfs(node, new_power); } } } }; power_type solve(Graph &system, Graph &dijkstra_system) { dijkstra_system.dijkstra(); for (int i = 1; i < system.nodes.size(); i++) { system.nodes[i].min_multiplier = dijkstra_system.nodes[i].min_multiplier; system.nodes[i].graph_max_power = system.nodes[system.nodes.size() - 1]._max_power / system.nodes[i].min_multiplier; // printf("id: %d mp: %lld mm: %lld MP: %lld\n", i, system.nodes[i]._max_power, // system.nodes[i].min_multiplier, system.nodes[i].max_power()); } system.dfs(&system.nodes[1], 1); return system.result; } void process_test() { int n, m; Graph system, dijkstra_system; scanf("%d %d", &n, &m); system.nodes.push_back(Node()); dijkstra_system.nodes.push_back(Node()); for (int i = 0; i < n; i++) { Node router = Node(); power_type max_power; scanf("%lld", &max_power); router._max_power = max_power; router.id = i + 1; system.nodes.push_back(router); dijkstra_system.nodes.push_back(router); } for (int i = 0; i < m; i++) { int a, b; power_type w; scanf("%d %d %lld", &a, &b, &w); system.nodes[a].connections.push_back({&system.nodes[b], w}); dijkstra_system.nodes[b].connections.push_back({&dijkstra_system.nodes[a], w}); } printf("%lld\n", solve(system, dijkstra_system)); } int main() { int t; scanf("%d", &t); // printf("%lld\n", MAX_POWER); for (int i = 0; i < t; i++) { process_test(); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | #include <cstdio> #include <queue> #include <set> #include <vector> const long long MAX_POWER = 1 << 30; using namespace std; using power_type = long long; struct Node { int id = 0; vector<pair<Node *, power_type>> connections; set<power_type> seen_powers; power_type _max_power = 0; power_type min_multiplier = MAX_POWER; power_type graph_max_power = 0; power_type max_power() { return min(_max_power, graph_max_power); } }; struct Graph { vector<Node> nodes; power_type result = -1; void dijkstra() { priority_queue<pair<power_type, Node *>, vector<pair<power_type, Node *>>, greater<pair<power_type, Node *>>> pq; nodes[nodes.size() - 1].min_multiplier = 1; pq.push({1, &nodes[nodes.size() - 1]}); while (!pq.empty()) { // power_type weight = pq.top().first; Node *u = pq.top().second; pq.pop(); for (auto &connection : u->connections) { auto [v, weight] = connection; power_type new_weight = u->min_multiplier * weight; // printf("u: %d v: %d nw: %lld\n", u->id, v->id, new_weight); if (v->min_multiplier > new_weight) { v->min_multiplier = new_weight; pq.push({new_weight, v}); } } } } void dfs(Node *current_node, power_type current_power) { if (current_node->id == nodes.size() - 1) { result = max(result, current_power); } current_node->seen_powers.insert(current_power); for (auto &connection : current_node->connections) { auto [node, power] = connection; power_type new_power = current_power * power; // printf("cn: %d nn: %d np: %lld mp: %lld \n", current_node->id, node->id, // new_power, node->max_power()); if (new_power <= node->max_power() && !node->seen_powers.contains(new_power)) { dfs(node, new_power); } } } }; power_type solve(Graph &system, Graph &dijkstra_system) { dijkstra_system.dijkstra(); for (int i = 1; i < system.nodes.size(); i++) { system.nodes[i].min_multiplier = dijkstra_system.nodes[i].min_multiplier; system.nodes[i].graph_max_power = system.nodes[system.nodes.size() - 1]._max_power / system.nodes[i].min_multiplier; // printf("id: %d mp: %lld mm: %lld MP: %lld\n", i, system.nodes[i]._max_power, // system.nodes[i].min_multiplier, system.nodes[i].max_power()); } system.dfs(&system.nodes[1], 1); return system.result; } void process_test() { int n, m; Graph system, dijkstra_system; scanf("%d %d", &n, &m); system.nodes.push_back(Node()); dijkstra_system.nodes.push_back(Node()); for (int i = 0; i < n; i++) { Node router = Node(); power_type max_power; scanf("%lld", &max_power); router._max_power = max_power; router.id = i + 1; system.nodes.push_back(router); dijkstra_system.nodes.push_back(router); } for (int i = 0; i < m; i++) { int a, b; power_type w; scanf("%d %d %lld", &a, &b, &w); system.nodes[a].connections.push_back({&system.nodes[b], w}); dijkstra_system.nodes[b].connections.push_back({&dijkstra_system.nodes[a], w}); } printf("%lld\n", solve(system, dijkstra_system)); } int main() { int t; scanf("%d", &t); // printf("%lld\n", MAX_POWER); for (int i = 0; i < t; i++) { process_test(); } } |