/**
[割点] poj 1523 SPF
求割点及去掉该割点后的连通分量个数。
dfn[] dfs产生的优先数
low[u] 从u或u的子孙出发通过回边可以到达的最低深度优先数
low[u] = min{dfn[u], min{low[w]|w是u的一个子女}, min{dfn[v]|v与u邻接且(u,v)是一条回边} }
顶点u是割点的充要条件是: u 或者 是具有两个以上子女的深度优先生成树的根,
或者虽不是一个根,但他有一个子女w使得low[w] >= dfn[u]
*/
#include <stdio.h>
#include <string.h>
#include <vector>
#include <algorithm>
using namespace std;
#define N 1001
vector<int> vec[N];
int low[N],dfn[N],subnet[N],vis[N];
int cnt,son,n;
void dfs(int u)
{
for(int i = 0; i < vec[u].size(); ++i)
{
int v = vec[u][i];
if(!vis[v])
{
vis[v] = 1;
low[v] = dfn[v] = ++cnt;
dfs(v);
low[u] = min(low[v],low[u]);
[割点] poj 1523 SPF
最新推荐文章于 2020-08-26 14:20:30 发布