首页 > 其他分享 >板子集合

板子集合

时间:2024-01-23 20:23:33浏览次数:31  
标签:tarjan int top 板子 ++ dfn low 集合

tarjan

点击查看代码
//缩点
void tarjan(int u){
    dfn[u]=low[u]=++t;
    s[++top]=u;vis[u]=1;
    for(int i=0;i<g[u].size();++i){
        int v=g[u][i];
        if(!dfn[v]){
            tarjan(v);low[u]=min(low[u],low[v]);
        }else  if(vis[v])  low[u]=min(low[u],low[v]);
    }if(dfn[u]==low[u]){
        vis[u]=0;
        c[++sum]++;fa[u]=sum;
        while(s[top]^u){
            vis[st[top]]=0;
            c[sum]++;fa[s[top--]]=sum;
        }--top;
    }
}
//割点
void tarjan(int u){
    dfn[u]=low[u]=++t;int f=0;
    for(int i=0;i<g[u].size();++i){
        int v=g[u][i];
        if(!dfn[v]){
            tarjan(v);
            low[u]=min(low[u],low[v]);
            if(dfn[u]<=low[v])  ++f;
        }else  low[u]=min(low[u],dfn[v]);
    }if((u==rt&&f>1)||(u!=rt&&f))  q.push(u);
}
//割边
void tarjan(int u){
    dfn[u]=low[u]=++t;int f=0;
    for(int i=0;i<g[u].size();++i){
        int v=g[u][i];
        if(!dfn[v]){
            tarjan(v);
            low[u]=min(low[u],low[v]);
            if(dfn[u]<low[v])  a[++cnt]={min(u,v),max(u,v)};
        }else  low[u]=min(low[u],dfn[v]);
    }
}
//点双
void tarjan(int u){
    dfn[u]=low[u]=++t;st[++top]=u;int f=0;
    for(int i=0;i<g[u].size();++i){
        int v=g[u][i];
        if(!dfn[v]){
            tarjan(v);
            low[u]=min(low[u],low[v]);++f;
            if(dfn[u]<=low[v]){
                a[++ans].push_back(u);
                while(st[top+1]!=v)  a[ans].push_back(st[top--]);
            }  
        }else  low[u]=min(low[u],dfn[v]);
    }if(u==rt&&!f)  a[++ans].push_back(u);
}
//边双
void tarjan(int u,int fa){
    dfn[u]=low[u]=++t;s[++top]=u;
    for(in ti=0;i<g[u].size();++i){
        int v=g[u][i];
        if(!dfn[v]){
            tarjan(v,u);
            if(low[v]>=dfn[u])  continue;
            low[u]=min(low[u],low[v]);
        }else  if(v^fa)  low[u]=min(low[u],low[v]);
    }if(dfn[u]==low[u]){
        vis[u]=0;fa[u]=++sum;
        while(s[top]^u){
            vis[s[top]]=0;f[s[top--]]=sum;
        }--top;
    }
}

标签:tarjan,int,top,板子,++,dfn,low,集合
From: https://www.cnblogs.com/yswn/p/17983341

相关文章

  • 判断两个不重复的list集合是否相等 只比较元素值 不比较顺序
    判断两个不重复的list集合是否相等只比较元素值不比较顺序......
  • Java集合篇
    面渣逆袭一、Java集合篇2024/1/22哈希冲突的解决方案:哈希冲突是指输入两个不同的值,通过同一个哈希函数,得到一个相同的值;而HashMap是通过链表的方式来解决哈希冲突;链地址法:在冲突的位置拉一个链表,把冲突的元素放进去;开放定址法:从冲突的位置上接着往下找,给冲突元素......
  • STL-Set集合
    STL-Set集合目录STL-Set集合导入构造插入删除查找元素遍历元素成员方法multisetunordered_set参考资料set集合unordered_set无序集合set的元素不像map那样可以同时拥有实值和键值,set的元素即是键值又是实值。set不允许两个元素有相同的键值。不允许出现相同的两个se......
  • day09-集合
    集合(Set)是一种可变、无序的数据类型,集合中的元素是唯一的,不重复的诶?我们之前讲过的字典也是同样的可变,无序的数据类型,但是字典是键值对的存储形式,而集合不是1、初识集合集合使用大括号{}包裹着,元素之间使用逗号,分隔,集合中的元素可以是字符串、数字、元祖等其他任何不可变......
  • 集合进阶
    集合进阶集合体系结构​ List->ArrayList,LinkedList,Collection<​ Set->HashSet(->LinkedHashSet),TreeSet,List系列集合:添加的元素是有序,可重复,有索引.Set系列集合:添加的元素是无序,不重复,无索引.单列集合CollectionCollection是......
  • 传入一个List集合,返回分页好的数据
    传入一个List集合,返回分页好的数据。定义分页信息类:packagecom.cn.common;importjava.util.List;publicclassCommonPage<T>{privateintcurrentPage;privateinttotalPage;privateintpageSize;privatejava.util.List<T>list;publ......
  • 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象
    快速对比两个list数据集合此文引用csdn:https://blog.csdn.net/Zhu_daye/article/details/104798410小批量、快速对比两个list数据集合usingSystem.Linq.Expressions;Main();voidMain(){//对比源集合varsource=GenerateStudent(1,10000,1000);//......
  • shiro实现用户踢出,在线用户列表展示功能,包含常见踩坑集合、代码下载
    功能描述:用户a登录了s账号,接着用户b也登录了s账号,此时用户a将被踢出。一个账号只能一个人登录,被别人登录了,那么你就要被踢下线。本文目录shiro认证与授权理解实现需求核心以下是实现shiro用户踢出KickOutListener(登录成功后加入业务逻辑)kickOutFilter(进入controller的初级验证)配置......
  • trick 集合
    trick集合1.基础判断是否\(\foralli\)有\(x<a_i\):转化为是否\(x<\min(a_i)\)。大于类似。P9868&题解,ABC223F&题解括号序列:是括号序列的条件:总共的左括号和右括号数量相等;任意前缀的左括号数量\(\ge\)右括号数量。若将序列中左括号看作......
  • Rust 常见集合
    目录使用Vector储存列表新建vectorVec::new函数(无初值)vec!宏(有初值)更新vector读取vector的元素注意可变和不可变引用遍历vector中的元素使用枚举来储存多种类型丢弃vector时也会丢弃其所有元素使用字符串储存UTF-8编码的文本什么是字符串?新建字符串更新字符串使......