动态规划对状态空间的遍历构成一张有向无环图,遍历顺序就是该有向无环图的一个拓扑序。
#include <bits/stdc++.h> #define sc(x) scanf("%d", &(x)) #define pr(x) printf("%d\n", (x)) #define rep(i, l, r) for (int i = l; i <= r; ++i) using namespace std; typedef long long ll; const int N = 1e5 + 7; vector<int> g[N], id; int dp[N]; int main() { int n, m; sc(n), sc(m); for (int i = 0, a, b; i < m; ++i) { sc(a), sc(b); g[a].emplace_back(b), g[b].emplace_back(a); } for (int i = 0; i < n; i++) id.emplace_back(i); sort(id.begin(), id.end(), [&](int a, int b) { return g[a].size() < g[b].size(); }); // 按度从小到大排序 int ans = 0; for (int i : id) { dp[i] = 1; for (int j : g[i]) if (g[j].size() < g[i].size()) // 可以继承 dp[i] = max(dp[i], dp[j] + 1); // 无权 ans = max(ans, dp[i]); } pr(ans); return 0; }