DAG 上的 dp
约 510 字大约 2 分钟
2026-02-20
Preface
首先介绍一下 DAG,叫做有向无环图,英文名叫 Directed Acyclic Graph,缩写是 DAG。如果你想了解更详细的内容可以前往 OI-WIKI
如下图所示,就是一个 DAG,因为它没有环路。

那么这个博客的灵感就来源于我最近做的一个 F. Parabola Independence,先来简单讲一下题目意思:
题目
给定 n 个形如 g:g(x)=ax2+bx+c,x∈R 的双曲线,如果称 g1,g2 是独立的,当且仅当它们在坐标系上没有交点。
如果称一个有序函数集合 G={g1,g2,g3,⋯,gn} 是 organized 的,当且仅当 ∀ i,j,1⩽i<j⩽∣G∣ 都满足 gi,gj 是独立的。
现有一个集合 F={f1,f2,f3,⋯,fn} 求 ∀ i=1,2,3,⋯,n,计算包含其 organized 的最大子集大小。如下图所示,橙色与红色不满足独立,但蓝色满足与红色独立,且与橙色也独立。

数据范围满足 n⩽3000,a,b,c⩽1×109
分析问题
首先我们先判定两个函数 f,g 是否独立,我们可以通过 f−g 的判别式进行判断,设两个函数分别为:
- f(x)=a1x2+b1x+c1
- g(x)=a2x2+b2x+c2
则
f−g⟹(a1−a2)x2+(b1−b2)x+(c1−c2)=0
计算判别式 Δ=B2−4AC,若 Δ⩾0,则有交点,下面是实现方案:
hasIntersection.cc
bool hasIntersection(int a1, int b1, int c1, int a2, int b2, int c2)
{
ll A = (ll)a1 - a2;
ll B = (ll)b1 - b2;
ll C = (ll)c1 - c2;
if (A != 0)
{
ll delta = B * B - 4 * A * C;
return delta >= 0;
}
else
{
if (B != 0)
{
return true;
}
else
{
return C == 0;
}
}
}然后我们注意数据范围是 n⩽3000,那么期望复杂度是 O(n2)
