DFS框架:
vector<int> G[maxn];
int vis[maxn];
void dfs(int u)
{
vis[u] = 1;
PREVISIT(u);
int d = G[u].size();
for(int i = 0; i < d; i++)
{
int v = G[u][i];
if(!vis[i])
dfs(i);
}
POSTVISIT(u);
}
G[u][i]表示节点u的第i个子节点
可以将递归改称非递归防止溢出
从等价关系定义等价类。我们可以把互相到达的节点称为一个连通分量。很容易用DFS在线性时间内求出任意无向图的连通分量。
void find_cc()
{
current_cc = 0;
memset(vis,0,sizeof(vis));
for(int u = 0; u < n; u++) //检查图中的每个节点
if(!vis[u]) //如果节点u没有访问过,意味着属于一个新的连通分量
{
current_cc++; //连通分量的数量
dfs(u); //从节点u开始DFS可以访问到它所在的整个连通分量
}
}
这里有个全局的变量current_cc表示当前连通分量的编号。
如果要记录每个节点的连通分量的数量,就需要在PREVISIT(u)中赋值
cc[u] = current_cc;
如果只求连通分量,使用并查集比较快