解题思路
同一波次里的模型必须互不依赖,因此每一条约束 u→v(v 等 u)都会把 v 至少推到比 u 更靠后的一波。最少波次就是图上最长那条链的长度。
- 建图。第 k 条 rel[k]=[u,v] 表示 u 必须排在 v 前面,连有向边 u→v。题面保证无环,所以这是一张 DAG。
- 设 dp[x] 为「以编号 x 结尾的最长链包含几个模型」。没有入边的点 dp=1,它们可以放进第一波。
- 按拓扑序松弛:处理完 u 之后,对每条边 u→v 做 dp[v]=max(dp[v],dp[u]+1)。入度降到 0 的点入队,即 Kahn 算法。
- 答案是 max(dp[1..p])。全无约束时所有点都是孤立点,答案为 1;一条贯穿 p 个点的链,答案为 p。
- 常见假解:把图当成无向图做 BFS;输出连通块个数;输出最大入度加一(链的入度全是 1,答案却是 p);把边方向建反。