tarjan算法

来源:互联网 发布:ai寻路算法 编辑:程序博客网 时间:2024/05/16 09:38

tarjan算法是一种求强联通分量的算法,通过访问节点遍历。有几个比较重要的知识:

强联通分量:如果一个集合中的所有的节点都可以互相到达,那么这个集合就是一个强联通分量。

dfn【i】:记录节点i第几个被访问。

low【i】:记录节点i可以追溯到的最早的祖先

zh【i】:栈中第i个元素

vis【i】:记录i是否在栈中

首先,寻找没有更新过dfn的节点开始tarjan:

1、更新dfn【f】与low【f】,将f入栈

2、寻找与i相连的节点v

3、如果节点v没有被访问,那么tarjan v low    low[f]=min(low[f],low[v]);(强联通分量两点相连,因此下级的节点会找到先前被搜过的节点)

4、如果节点v被访问过且在栈中,那么low[f]=min(low[f],dfn[v]),即下级的节点会找到先前被搜过的节点

ps:这里的low也可以用low[f]=min(low[f],low[v])更新

5。若f的dfn与low相等,即f为某个强联通分量的第一个被访问的节点,那么就弹出栈中比f入栈晚的节点输出

代码如下:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
int dfn[100001],low[100001],a,b,c,head[100001],cnt,tot,top,siz,zh[100001],vis[100001];
struct node{
    int to,next;
}edge[100001];
int add(int s,int t)
{
    edge[++cnt].to=t;
    edge[cnt].next=head[s];
    head[s]=cnt;
}
int find(int f)
{
    tot++;top++;
    dfn[f]=low[f]=tot;
    vis[f]=1;zh[top]=f;
    for(int i=head[f];i!=0;i=edge[i].next)
    {
        int v=edge[i].to;
        if(!dfn[v])
        {
            find(v);low[f]=min(low[f],low[v]);
        }
        else if(vis[v]) low[f]=min(low[f],dfn[v]);
    }
    if(dfn[f]==low[f])
    {
        siz++;
        while(f!=zh[top])
        {
 //           cout<<zh[top]<<" ";
            top--;
        }   
            vis[f]=0;//cout<<f<<endl;
            top--;
    }
}
int main()
{
while(cin>>a>>b)
{
    siz=cnt=tot=top=0;
    for(int i=1;i<=b;i++)
    {
        int x,y;cin>>x>>y;add(x,y);
    }
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=a;i++)
    {
        if(!dfn[i]) find(i);
    }
}
}



阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 建筑行业增值税税率 运输企业增值税税率 高新技术企业的税率 小规模纳税人增值税税率 营业税金及附加税率 营改增后餐饮业税率 高新技术企业所得税率 装卸搬运营业税税率 房地产企业增值税税率 金银首饰消费税税率 广告业一般纳税人税率 税盘 税盘是什么 税目 消费税税目 印花税税目 税目是什么 2018资源税税目税率表 车船税税目税额表 印花税税目税率表 新车船税税目税额表 车船税税目税额表2019 所得税税目税率表 个人所得税税目税率 2019年增值税税目表大全 2019年印花税税目表 城镇土地使用税税目 税种 税种有哪些 税种分类 企业税种 享受地方税种 小税种有哪些 个人独资企业税种 谁可以享受地方税种 税负率 税负 增值税税负 税负转嫁 税负怎么算 什么是税负