割点.cpp

来自「求有向图的强连通分量」· C++ 代码 · 共 54 行

CPP
54
字号


// Cutvertex :

int N, edg[128][128], cnt[128];
int color, ti, cutvertexnum, cutvertexlist[MAXN];
int vis[MAXN], d[MAXN], low[MAXN];


void dfsvisit(int u, int p)
{
	int i, v, s=0, bVertex=0;
	low[u] = d[u] = ++ti;
	vis[u] = -color;
	for(i=0; i<cnt[u]; ++i)
	{
		v = edg[u][i];
		if(v==u) continue;
		if(!vis[v]) 
		{
			++s;
			dfsvisit(v,u);
			if(low[v] < low[u])
				low[u] = low[v];
			if(low[v] >= d[u])
				bVertex = 1;
		}
		else
			if(d[v] < low[u])
				low[u] = d[v];
	}
	if((p&&bVertex) || (!p&&s>1))
		cutvertexlist[cutvertexnum++] = u;
}

void dfs()
{
	int i, u;

	memset(vis, 0, sizeof(vis));
	color = cutvertexnum = ti = 0;

	for(u=1; u<=N; ++u)
		if(!vis[u])
		{
			++color;
			dfsvisit(u,0);
		}
	cout << cutvertexnum << endl;
	for(i=0; i<cutvertexnum; ++i)
		cout << cutvertexlist[i] << " ";
	cout << endl;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?