错误的写法
int c[N];//c[i]表示i点属于第几个连通块
dfs(1)//主函数中
void dfs(int u)
{
if(u>n)return;
if(st[u])dfs(u+1);
if(!st[u])
{
c[u]=cnt;
st[u]=1;
}
for(int i=h[u];~i;i=ne[i])//遍历所有临点,加入到连通块中去,因为前向星无法处理,a->b,b->c这种情况,所以有问题!
{
int j=e[i];
if(!st[j])
{
c[j]=cnt;
st[j]=1;
}
}
cnt++;
dfs(u+1);
}
蓝书上的写法
st[i]表示i属于第几个连通块,同时起到标记i的作用。
for(int i=1;i<=n;i++)
{
if(!st[i])
{
cnt++;
dfs(i);
}
}
void dfs(int u)
{
st[u]=cnt;
for(int i=h[u];~i;i=ne[i])
{
int j=e[i];
if(st[j])continue;
dfs(j);
}
}