#include <cstdio> #include <vector> #define FOR(i,a,b) for(int i=(int)(a); i<(int)(b); ++i) #define ulli unsigned long long int using namespace std; struct Node; typedef Node *NodePtr; struct Edge { NodePtr dst; int mult; Edge(NodePtr _d, int _m):dst(_d),mult(_m){} }; struct Node { vector<Edge> adj; int max; }; int T, n, m, result; vector<Node> nodes; NodePtr finish; void dfs(NodePtr node, int value) { if (node == finish && result < value) result = value; FOR(i,0,node->adj.size()) { NodePtr next = node->adj[i].dst; ulli new_value = (ulli)(node->adj[i].mult) * (ulli)(value); if (new_value > (ulli)(next->max)) continue; dfs(next, (int)(new_value)); } } int main() { scanf("%d", &T); while (T--) { // Read input scanf("%d %d", &n, &m); nodes.resize(n); FOR(i,0,n) { scanf("%d", &nodes[i].max); nodes[i].adj.clear(); } FOR(i,0,m) { int src, dst, mult; scanf("%d %d %d", &src, &dst, &mult); nodes[src-1].adj.push_back(Edge(&nodes[dst-1], mult)); } // Bruteforce finish = &nodes[n-1]; result = -1; dfs(&nodes[0], 1); // Print result printf("%d\n", result); } }
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 | #include <cstdio> #include <vector> #define FOR(i,a,b) for(int i=(int)(a); i<(int)(b); ++i) #define ulli unsigned long long int using namespace std; struct Node; typedef Node *NodePtr; struct Edge { NodePtr dst; int mult; Edge(NodePtr _d, int _m):dst(_d),mult(_m){} }; struct Node { vector<Edge> adj; int max; }; int T, n, m, result; vector<Node> nodes; NodePtr finish; void dfs(NodePtr node, int value) { if (node == finish && result < value) result = value; FOR(i,0,node->adj.size()) { NodePtr next = node->adj[i].dst; ulli new_value = (ulli)(node->adj[i].mult) * (ulli)(value); if (new_value > (ulli)(next->max)) continue; dfs(next, (int)(new_value)); } } int main() { scanf("%d", &T); while (T--) { // Read input scanf("%d %d", &n, &m); nodes.resize(n); FOR(i,0,n) { scanf("%d", &nodes[i].max); nodes[i].adj.clear(); } FOR(i,0,m) { int src, dst, mult; scanf("%d %d %d", &src, &dst, &mult); nodes[src-1].adj.push_back(Edge(&nodes[dst-1], mult)); } // Bruteforce finish = &nodes[n-1]; result = -1; dfs(&nodes[0], 1); // Print result printf("%d\n", result); } } |