栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Tarjan算法求连通分量 割点 LCA模版

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Tarjan算法求连通分量 割点 LCA模版

连通分量(low相同即为连通分量)

#include 
#include 
#include 
#include 
using namespace std;
int dfn[100],low[100];
int e[100],h[100],ne[100];
int idx,times,vi[100];
vector color[100];
vector s;
void add(int a,int b)
{
    e[++idx]=b;
    ne[idx]=h[a];
    h[a]=idx;
}
void dfs(int x)
{
    s.push_back(x);
    vi[x]=true;
    dfn[x]=low[x]=++times;//记录时间戳
    for(int i=h[x];i;i=ne[i])
    {
        int j=e[i];
        if(dfn[j]==0)
        {
            dfs(j);
            low[x]=min(low[x],low[j]);//连通且没被遍历过就改变low
        }
        else if(vi[j]) low[x]=min(low[x],low[j]);//如果被遍历过但在栈中也改变low
    }
    
    if(dfn[x]==low[x])//找到一个连通分量的头结点 出栈
    {
        while(!s.empty() && low[s.back()]==low[x])//一直出到没有一样的low值
        {
            int j=s.back();
            color[x].push_back(j);
            s.pop_back();
            vi[j]=false;
        }
    }
}
int main()
{
    add(1,2);
    add(2,3);
    add(3,4);
    add(3,5);
    add(4,5);
    add(4,2);
    add(1,6);
    add(6,7);
    add(7,1);
    
    for(int i=1;i<=7;i++)
    {
        if(!dfn[i])
        dfs(i);
    }
    
    for(int i=1;i<=7;i++)
    {
    for(int j=0;j 

割点

洛谷P3388【模板】割点(割顶) - 洛谷

#include 
#include 
#include 
#include 
using namespace std;
int dfn[200100],low[200100];
int e[250000],h[201000],ne[250000];
int idx,times,fa[201000];
int n,m,r;
set res;//set中有序且无重复点
void add(int a,int b)
{
    e[++idx]=b;
    ne[idx]=h[a];
    h[a]=idx;
}
void dfs(int x)
{
    dfn[x]=low[x]=++times;
    int child=0;
    for(int i=h[x];i;i=ne[i])
    {
        int j=e[i];
        if(dfn[j]==0)
        {
            if(fa[x]==-1) child++;
            fa[j]=x;
            dfs(j);
            if(-1==fa[x] && child>=2) res.insert(x);
            if(-1!=fa[x] && low[j]>=dfn[x]) res.insert(x);
            low[x]=min(low[x],low[j]);
        }
        else if(j!=fa[x]) low[x]=min(low[x],dfn[j]);//非父子结点这里一定要更新为dfn!!卡了好几次
    }
}
    
int main()
{
    cin>>n>>m;
    for(int i=0;i::iterator j = res.begin(); j != res.end(); ++j)
    printf("%d ",*j);
    return 0;
}

LCA

#include 
#include 
#include 
using namespace std;
typedef pair PII;
int h[500010],ne[1000010],e[1000010];
bool vis[500010];
int res[500010],p[500010];
vector q[500010];
int n,m,s,idx;
void add(int a,int b)
{
    idx++;
    e[idx]=b;
    ne[idx]=h[a];
    h[a]=idx;
}

int find(int x)
{
    if(p[x]!=x) p[x]=find(p[x]);
    return p[x];
}

void tarjan(int t)
{
    vis[t]=true;
    for(int i=h[t];i;i=ne[i])
    {
        int j=e[i];
        if(vis[j]) continue;
        tarjan(j);
        p[j]=find(t);
    }
    for(auto item : q[t])
    {
        int y=item.first,id=item.second;
        if(vis[y])
            res[id]=find(y);
    }
}
int main()
{
    scanf("%d%d%d",&n,&m,&s);
    for(int i=1;i<=n;i++)
    p[i]=i;
    for(int i=1;i 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/604958.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号