P3916 scc缩点入门

题目链接

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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值