当前位置: 代码迷 >> 综合 >> 『强连通分量·DAG最长链』Grouping
  详细解决方案

『强连通分量·DAG最长链』Grouping

热度:27   发布时间:2023-12-17 11:11:22.0

题目描述

告诉你某些人的年龄大小关系,问你把所有的人分成若干个组,最少需要多少组,使得组内任意两个人的年龄不可比。

题解

如果存在环,这些人一定相等。因此可比。为了统计方便可以缩点。

如果存在一条链,这些人也能可比,因此这些链不能处于同一组。

我们在缩点以后,每个点的点权为缩点以后的点集大小,则答案为缩点以后点权和最大的最长链。

一下给出证明:

  • 因为最长链上的点任意两个分在一组都能到达,因此答案至少算是最长链。
  • 最长链如果是连出去的,连出去的长度一定没有剩下的长,可以一一配对。
  • 连进去同理。
  • 因此答案一定是最长链。

然后我们再用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,