tarjan缩点

tarjan 缩点的方法:用tarjan求强连通分量,然后将同一个强连通分量中的点合成到同一个新节点中(需要借助一个belong数组)。

题目链接:P3387缩点

思路:先缩点,新节点的值等于强连通分量中所有节点权值之和。缩点之后就由原图得到了一张新图(其实是一棵树),然后再dfs,求出从根节点到叶子节点权值之和的最大值(dp)。

代码:

#include 
#include 
#include 
#include
#define fori(a,b,c) for(int a=b;a<=c;a++)
#define ford(a,b,c) for(int a=c;a>=b;a--)
#define mem0(x) memset(x,0,sizeof(x))
#define mem1(x) memset(x,-1,sizeof(x))
using namespace std;
const int M=1e4+20;

int dfn[M],low[M],in[M],q[M],tot,top;
int n,m,a[M],b[M],belong[M],sum,vis[M];

//belong数组用来保存原节点合成到哪一个新节点中

vector g1[M],g2[M];

void tarjan(int x)
{
    dfn[x]=low[x]=++tot;
    q[top++]=x;
    in[x]=1;
    for(int i=0;i

 

你可能感兴趣的:(tarjan,缩点,图论)