作物杂交
#include <algorithm> #include <iostream> using namespace std; const int N = 2000 + 5; int n, m, k, goal; int t[N]; bool ori[N]; int to[N][N]; int limit_time; struct father { int num; int u[N]; int v[N]; int limtime; } fa[N]; void input() { // N,M,K,T, // N 表示作物种类总数 (编号 1 至 N), // M 表示初始拥有的作物种子类型数量, // K 表示可以杂交的方案数,T 表示目标种子的编号。 cin >> n >> m >> k >> goal; for (int i = 1; i <= n; i++) cin >> t[i]; for (int i = 1, z; i <= m; i++) { cin >> z; ori[z] = true; } for (int i = 1, u, v, w; i <= k; i++) { cin >> u >> v >> w; to[u][v] = to[v][u] = w; int x = ++fa[w].num; if (t[u] < t[v]) swap(u, v); fa[w].u[x] = u; fa[w].v[x] = v; } } bool dfs(int x) { if (fa[x].num == 0) return false; for (int i = 1; i <= fa[x].num; i++) { int v = fa[x].v[i]; int u = fa[x].u[i]; if (!ori[u]) { if (!dfs(u)) continue; } if (!ori[v]) { if (!dfs(v)) continue; } if (!fa[x].limtime) fa[x].limtime = max(fa[u].limtime, fa[v].limtime) + max(t[u], t[v]); else fa[x].limtime = min(fa[x].limtime, max(fa[u].limtime, fa[v].limtime) + max(t[u], t[v])); } ori[x] = true; return true; } int main() { input(); dfs(goal); cout << fa[goal].limtime; return 0; }
算法竞赛之路 文章被收录于专栏
整理、记录算法竞赛的好题