题目链接
https://www.luogu.com.cn/problem/P3916
题意
有向图,问每个点可达最大节点编号
思路
如果是树,那么直接树形DP
但是是有向图,好吧
一个做法是反向建图,从大到小做dfs,很讨巧的方法。
这里说下缩点
说来惭愧,学了tarjan那几件套都没怎么做过题,一眼没看出来。
就是求强连通分量,然后缩点成dag,直接跑树形dp就行了。
缩点的操作就是跑出scc数组后,重新建图(原图已经无所谓了),改成sc个点即可。
重新建图拿数组存一下边就好了(或者你也可以混用邻接矩阵和前向星啊)
代码
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<map>
#include<unordered_map>
#include<string>
#include<queue>
#include<stack>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<chrono>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl "\n"
//#define int long long
//#define double long double
using namespace std;
typedef long long ll;
int n,m,k;
const int maxn=1e6+5;
const int maxe=1e6+5;
const int inf=0x3f3f3f3f;
int dfn[maxn]