总览:
就是生成搜索树,然后找返祖边。
模板:
vector <int> ljb[N];
int dfn[N],low[N],tim,num,belong[N];
bool ex[N];
stack <int> st;
void tarjan(int x)
{
dfn[x]=low[x]=++tim;
st.push(x);
ex[x]=1;
for(int y=0;y<ljb1[x].size();y++)
{
int z=ljb1[x][y];
if(!dfn[z])
{
tarjan(x,z);
low[x]=min(low[x],low[z]);
}
else
if(ex[z])
low[x]=min(low[x],dfn[z]);
}
if(dfn[x]==low[x])
{
int y=st.top();
num++;
while(y!=x)
{
ex[y]=0;
belong[y]=num;
st.pop();
y=st.top();
}
ex[x]=0;
belong[x]=num;
st.pop();
}
}
T1 P3387 【模板】缩点
(洛谷P3387)
题目背景
缩点+DP
题目描述
给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大。你只需要求出这个权值和。
允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次。
输入格式
第一行,n,m
第二行,n个整数,依次代表点权
第三至m+2行,每行两个整数u,v,表示u->v有一条有向边
输出格式
共一行,最大的点权之和。
输入输出样例
输入 #1
2 2
1 1
1 2
2 1
输出 #1
2
说明/提示
n < = 1 0 4 , m < = 1 0 5 , 0 < = 点 权 < = 1000 n<=10^4 ,m<=10^5,0<=点权<=1000 n<=104,m<=105,0<=