Tarjan_com.pakdata.QuranMajeed

Tarjan_com.pakdata.QuranMajeedTarjanTarjan是一种求有向图强联通分量的算法,是用dfs实现以及时间戳标记访问最短时间的.Tarjan算法中每个点都需要扩展边,为了存储方便,推荐使用邻接表.Tarjan算法的优势在于其灵活性,基础代码可以直接适用于多数情况.常见于dfs序.

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

Tarjan

0.2

目录


基本概念

    Tarjan是一种求有向图强联通分量的算法, 是用dfs实现以及时间戳标记访问最短时间的.Tarjan算法中每个点都需要扩展边,为了存储方便,推荐使用邻接表.Tarjan算法的优势在于其灵活性,基础代码可以直接适用于多数情况.常见于dfs序.

Jetbrains全家桶1年46,售后保障稳定

运行Tarjan算法的过程中,每个顶点都被访问了一次,且只进结合.出了一次堆栈,每条边也只被访问了一次,所以该算法的时间复杂度为O(N+M)。


基础代码

#include <cstdio>
#include <stack>
#include <iostream>
using namespace std;
int f[11],ro,dfn[11],low[11],g[11],c;
bool v[11];
stack<int> q;
struct $
{
    int s,t,ne;
}a[11];
void Tarjan(int co)
{
    /*dfn层数 low最早到达时间*/
    dfn[co]=low[co]=++c;//标记当前时间戳
    q.push(co);//将点压入栈
    for(int k=f[co];k;k=a[k].ne)
    {
        int i=a[k].t;
        if(v[i]) continue;//如果已经访问过,就跳过
        //dfs
        if(!dfn[i])//这个表示该点是否已经被打上时间戳
        {
            Tarjan(i);
            low[co]=min(low[co],low[i]);
            //如果否,打上最小时间戳.
        }
        else
            low[co]=min(low[co],dfn[i]);
    }
    if(dfn[co]==low[co])//找到根
    {
        sum++;//记录分量数量
        int i;
        while(i!=co)
        {
            i=q.top();
            v[i]=true;//标记找到
            g[i]=co;//记录每个点的根,在缩图时用
            q.pop();
        }
        v[co]=1;
        if(!q.empty())q.pop();//有些特殊情况不判断可能会崩溃
    }
}
int main()
{
    int n;cin>>n;
    for(int i=1;i<=n;i++)//链式前向星
        while(1)
        {
            scanf("%d",&v);
            if(!v) break;
            a[++ro].s=i;
            a[ro].t=v;
            a[ro].ne=f[i];
            f[i]=v;
        }
    for(int i=1;i<=n;i++)//扩展
        if(!dfn[i])
        {
            c=0;
            Tarjan(i);
        }
    return 0;
}

常见变换

(main())
if(c==1)//c标记强联通分量数量
    printf("该图强联通\n");

void rebuild()//缩图去环
{
    for(int i=1;i<=ro/*路的数量*/;i++)
        if(g[a[i].s]!=g[a[i].t])//如果路的两端分别在两个强联通分量中
            合并;

}
void degree()//入度出度计算,紧接rebuild()
{
    int ina=0,outa=0,vi[11]={
  
  0},vo[11]={
  
  0};//标记点是否有出入度,可根据需要改为计数
    for(int i=1;i<=ro)
        if(g[a[i].s]!=g[a[i].t])
        {
            //在这里改为++即可
            vi[a[i].t]=1;
            vo[a[i].s]=1;
        }
    for(int i=1;i<=n;i++)
    {
        if(!vi[i]) ina++;
        if(!vo[i]) outa++;
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/215456.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • VBScript教程-第二章. 运行脚本

    VBScript教程-第二章. 运行脚本因为过年,一直没有更新教程.发现按照这个进度得下个世纪能完成我这宏伟的小计划,所以最近我会加快进度.好多人问我学习方法,其实真的是学习没有捷径.最后说一句,学习脚本最好准备一份帮助文档,vbs就下载script56.chm这个文件就行了.=========================万恶的分割线后开始正题=====================…

    2022年6月17日
    20
  • MySQL数据类型选择「建议收藏」

    MySQL数据类型选择「建议收藏」前言在MySQL中,选择正确的数据类型,对于性能至关重要。一般应从以下两个方面考量:确定合适的大类型:数值、字符串、时间、二进制;确定具体的类型:有无符号、取值范围、变长定长等。在MySQL数据类型设置方面,尽量采用更小的数据类型,因为它们占用的存储空间更小,通常有更好的性能,花费更少的硬件资源。并且,尽量把字段定义为NOTNULL,避免使用NULL。1.字符串类型类型大小用途CHAR0-255字节定长字符串,char(n)当插入的字符串实际长度不足n时,插

    2026年1月29日
    6
  • css如何设置透明度

    css如何设置透明度今天面试遇到了一个之前写 css 样式时没太注意的问题 关于 css 如何设置透明度

    2025年9月12日
    5
  • RenderControl输出html遇到的问题

    RenderControl输出html遇到的问题当我直接在后台用GridView gv=new GridView();gv.RenderControl(htmlwrite);没有问题,但是如果我从工具直接拖一个GridView到设计页面,在后台gv.RenderControl(htmlwrite);就会出现Control GridViewTotal of type GridView must be placed inside a f

    2022年7月20日
    16
  • 儿童节快乐,2018过的真快

    我们也曾是儿童,也过过儿童节!儿童节,现在回想起来怎么都没有任何印象!儿童节让我想到了自己的小时候,自己的小学,三年级前上学的地方还离家很近,之后到了另一个地方上学,每天早上要很早起床,尤其是冬天的时候天还没有亮(北方的那个冬天的早上,真是冷啊,记得最冷的时候早上去上学的路上,冷的不行了,先打一堆火,烤一会再走),小时候早上上学的时候,妈妈就很早起床给我做早饭了,我吃过早饭然后去上…

    2022年2月27日
    50
  • 404页面制作

    404页面制作router/index.js//引用模板importErrorfrom’../components/Error.vue’//配置路由exportdefault[{ path:’*’, component:Error} ]Error.vue<template> <div> {{msg}} 页面不存在 </div…

    2022年7月27日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号