题目描述
告诉你某些人的年龄大小关系,问你把所有的人分成若干个组,最少需要多少组,使得组内任意两个人的年龄不可比。
题解
如果存在环,这些人一定相等。因此可比。为了统计方便可以缩点。
如果存在一条链,这些人也能可比,因此这些链不能处于同一组。
我们在缩点以后,每个点的点权为缩点以后的点集大小,则答案为缩点以后点权和最大的最长链。
一下给出证明:
- 因为最长链上的点任意两个分在一组都能到达,因此答案至少算是最长链。
- 最长链如果是连出去的,连出去的长度一定没有剩下的长,可以一一配对。
- 连进去同理。
- 因此答案一定是最长链。
然后我们再用DP很简单的求一下最长链即可。
#include <bits/stdc++.h>using namespace std;
const int N = 200000;
const int M = 400000;int n, m, top, tot, cnt, col, ans;
int Link[N], st[N], dfn[N], low[N], in[N], bel[N], f[N], du[N];struct edge {
int x,y,next;
}e[M*2];vector <int> a[N];
vector <int> scc[N];void clear(void)
{
top = tot = cnt = col = ans = 0;memset(f,0,sizeof f);memset(in,0,sizeof in);memset(du,