Tarjan算法、缩点染色及最小权点基

5G-A无源物联网:深度解析“不插电“智能的底层技术原理 北京移动推出5G-A无源物联网技术,实现电动车标签"零功耗"运行。该技术通过射频能量收集(利用5G-A基站高功率信号转换为电能)和反向散射通信(调制反射信号传输数据)两大核心技术,使设备无需电池即可工作。5G-A相比4G在信号能量密度、通信速率和定位精度等方面显著提升,结合通感一体等创新技术,为无源物联网提供商用基础。该方案已在北京小区试点应用,实现电动车精准定位管理,标签寿命可达5年以上。专家预测,这项技术将大幅降低物联网部署成本,推动"万物智联"时代的到来。 阅读详情

看了许多博客,还是这个最清楚:强连通算法–Tarjan个人理解+详解
墙裂安利大家看看上面的博客!讲的非常清楚!(但是文章的代码好像有一点点小错误。
Tarjan算法主要解决了有向图中有几个强连通分量的问题,基于Tarjan算法,可以对在同一连通分量的点染色,进而缩点,生成有向无环图。
例:给定有向图,求:

  1. 至少要选几个顶点,才能做到从这些顶点出发,可以到达全部顶点
  2. 至少要加多少条边,才能使得从任何一个顶点出发,都能到达全部顶点
    思路 缩点之后, DAG上面有多少个入度为0的顶点,问题1的答案就是多少;在DAG上要加几条边,才能使得DAG变成强连通的,问题2的答案就是多少。
    加边的方法:

假定有 n 个入度为0的点,m个出度为0的点,如何加边?
把所有入度为0的点编号 0,1,2,3,4 …N -1
每次为一个编号为i的入度0点可达的出度0点,添加一条出边,连到编号为(i+1)%N 的那个入度0点,这需要加n条边。
若 m <= n,则加了这n条边后,已经没有入度0点,则问题解决,一共加了n条边
若 m > n,则还有m-n个入度0点,则从这些点以外任取一点,和这些点都连上边,即可,这还需加m-n条边。
所以,max(m,n)就是第二个问题的解

附上代码:

#include<stdio.h>//代码仅供参考
#include<string.h>
#include<vector>
#include<algorithm>
#include<stack>
using namespace std;
#define maxn 1000000
struct E{
    int next,v;
}edge[maxn];
int head[maxn],k;
int vis[maxn];
int DFN[maxn],LOW[maxn],cnt,sig,color[maxn];
int in_cnt,out_cnt,in[maxn],out[maxn];
int n,m;
stack<int>S;
void init(){
    memset(head,-1,sizeof(head));
    memset(vis,0,sizeof(vis));
    memset(DFN,0,sizeof(DFN));
    memset(LOW,0,sizeof(DFN));
    memset(color,0,sizeof(color));
    memset(in,0,sizeof(in));
    memset(out,0,sizeof(out));
    while(!S.empty())S.pop();
    k = 0,cnt = 0,sig = 0;
}
void add(int u,int v){//链式前向星
    edge[++k].next = head[u];
    edge[k].v = v;
    head[u] = k;
}
void Tarjan(int u){
    DFN[u] = LOW[u] = ++cnt;
    vis[u] = 1;
    S.push(u);
    for(int i = head[u];i != -1;i = edge[i].next){
        int v = edge[i].v;
        if(!DFN[v]){
            Tarjan(v);
            LOW[u] = min(LOW[u],LOW[v]);
        }
        else if(vis[v] == 1){
            LOW[u] = min(LOW[u],LOW[v]);
        }
    }
    if(DFN[u] == LOW[u]){
        sig++;
        do{
            int x = S.top();
            color[x] = sig;
            S.pop();
            vis[x] = -1;
            printf("%d",x);
            if(x == u)break;
        }while(1);
        printf("\n");
    }
}

void Slove(){
    for(int i = 1; i <= n;++i){
        if(vis[i] == 0)Tarjan(i);
    }
    printf("强连通分量共%d个\n",sig);
}

//1) 至少要选几个顶点,才能做到从这些顶点出发,可以到达全部顶点

//2) 至少要加多少条边,才能使得从任何一个顶点出发,都能到达全部顶点
void scc(){
    if(sig == 1){
        printf("%d %d\n",1,0);
    }
    else{
        for(int i = 1; i <= n; ++i){
        for(int j = head[i]; j != -1;j = edge[j].next){
            int v = edge[j].v;
            if(color[i] != color[v]){
                in[color[v]]++;
                out[color[i]]++;
            }
        }
    }
    for(int i = 1; i <= sig;++i){
        if(!in[i])in_cnt++;
        if((!out[i]))out_cnt++;
    }

    printf("至少要选 %d 个顶点,才能从这些顶点出发,可达全部顶点\n至少要加 %d 条边,使得从任何一个顶点出发,到达全部顶点\n",in_cnt,max(in_cnt,out_cnt));
    }

}
int main()
{
    while(~scanf("%d",&n)){
        scanf("%d",&m);
        init();
        for(int i = 1; i <= m;++i){
            int u,v;
            scanf("%d%d",&u,&v);
            add(u,v);
        }
        Slove();
        for(int i = 1; i <= n;++i){
            printf("颜色%d,结点%d\n",color[i],i);
        }
        scc();
    }
}


一组测试用例
在这里插入图片描述

相关练习:
POJ2186找大牛
POJ1236

强连通图缩点的应用:最小点基

题目大意:

给你N个炸弹,对应已知其坐标和爆炸范围,以及引爆这个炸弹需要的花费,对应如果引爆了炸弹a,没有引爆炸弹b,但是b炸弹在a炸弹的作用范围之内,那么b炸弹也会被引爆,问将所有炸弹都引爆需要的最小花费。
思路:把可以引爆的炸弹间连边,建立有向图;如果有环,使用Tarjan算法缩点染色(同环内可以相互引爆);找到入度为0的分量,找出其中花费最小的点作为引爆这个分量及其相连分量的点累加。
综上所述,Tarjan强连通缩点染色之后,找到度为0的节点,并且在其中找到花费最小的炸弹,累加即可。
具体的:在DFN[u] == LOW[v]时更新分量的最小花费

关于最小点基和最小权点基:最小点基,最小权点基(Summer Holiday HDU - 1827)(强连通分量的应用)

CAN总线介绍及硬件设计 1. CAN是什么 CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO*1 国际标准化的串行通信协议。 在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统 被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很 多,线束的数量也随之增加。为适应“减少线束的数量”、“...... 阅读详情

相关推荐

车道线检测(传统基于Opencv的方法)

传统车道线检测方法主要是使用颜色选择、高斯平滑、边缘检测、ROI区域选择、霍夫变换、标定车道边界等Opnecv图像处理操作去检测道路上的车道线,我自己对很多用这类处理对很多道路场景车道线进行过实验,这类算法往往需要人工根据不同街道场景手动去反复调整各算法参数,从而才能使检测效果最佳。

Yangxiaoaijiejie的博客 2072

POJ2186 Popular Cows(Tarjan算法)

2186 Accepted 1708K 625MS C++ 2318B 用STL写的,哈哈,居然没有超时,很欣慰啊,贴出来大家参考一下…… /* 后来看了别人的代码后发现,其实可以找到强连通分量之后, 把其

284

本地部署DeepSeek-Coder-6.7B 离线版的完整指南:打造适配当前系统的AI助手

《DeepSeek-Coder-6.7B本地部署指南》详细介绍了如何离线部署这款专注于代码生成的AI模型。文章涵盖硬件要求(推荐8核CPU、32GB内存、NVIDIA RTX3080显卡)、软件依赖(Python3.8+、CUDA11.0+、PyTorch1.9+)以及具体安装步骤,包括模型下载、路径配置和GPU加速设置。重点说明如何通过输入系统配置文档和使用说明书,让模型生成适配特定系统的代码,并提供了参数调优和模型微调的方法。该指南旨在帮助开发者在本地安全高效地使用AI助手,实现代码自动生成与优化,提升

欢迎来到我的优快云博客!我专注于技术创新和数字化转型,特别是在低代码平台、人工智能和大数据分析领域的探索与应用。通过深入分析各种行业案例,帮助企业加速数字化进程,提升运营效率与创新能力。在这里,您将找到关于低代码平台、AI技术、数据分析与 1492

强连通算法--Tarjan的缩点及染色

Tarjan算法相当于在一个有向图中找有向环,那么我们Tarjan算法最直接的能力就是缩点辣!缩点基于一种染色实现,我们在Dfs的过程中,尝试把属于同一个强连通分量的点都染成一个颜色,那么同一个颜色的点,就相当于一个点。比如刚才的实例图中缩点之后就可以变成这样: 将一个有向带环图变成了一个有向无环图(DAG图)。很多算法要基于有向无环图才能进行的算法就需要使用Tarjan算法实现染色缩点,建...

mlm5678的博客 582

阿里云人工智能工程师ACA认证免费课程学习笔记

阿里云人工智能工程师ACA认证免费课程学习笔记

engchina的专栏 2013

SoapUI 5.0 模拟WebService接口实战:从WSDL文件到Mock服务端完整流程

本文详细介绍了如何使用SoapUI 5.0模拟WebService接口,从解析WSDL文件到搭建完整的Mock服务端流程。通过实战案例和效率技巧,帮助开发者快速掌握接口模拟技术,提升开发与测试效率。

weixin_26833139的博客 406

强连通算法--Tarjan个人理解+详解

首先我们引入定义: 1、有向图G中,以顶点v为起点的弧的数目称为v的出度,记做deg+(v);以顶点v为终点的弧的数目称为v的入度,记做deg-(v)。 2、如果在有向图G中,有一条有向道路,则v称为u可达的,或者说,从u可达v。

mengxiang000000 2万+

安装WSL过程中出现注册表编辑器无法重命名WSL。重命名项时出现错误的解决方案

本文主要介绍了安装WSL过程中出现注册表编辑器无法重命名WSL。重命名项时出现错误的解决方案,希望能对使用Windows WSL的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 9万+

Paint the Grid Reloaded zoj3781(缩点+dfs + bfs 染色)

Paint the Grid Reloaded Time Limit: 2 Seconds      Memory Limit: 65536 KB Leo has a grid with N rows and M columns. All cells are painted with either black or white initially. Two cells A and B

略略略的博客 438

华为OD机试真题 新系统2026-04-01 C++ 实现【计算数列位置N的值】

如果其前面的M个元素中,存在值相同的元素,则该位置上的数值等于前面M个数中最大的数值与最小的数值之如果其前面的M个元素中,不存在值相同的元素,则该位置上的数值等于前面M个数中最大的数值与最小的数值之差;1、输入M、N两个数,则按照以下规则形成一个数列;两个整数,用逗号分割,分别表示M和N。一个整数,表示数列第N个位置上的数值。2、数列的前M个元素的值为1到M;请计算该数列第N个位置上的数值。N取值范围:1<= N<=50。M取值范围:3<=M<=10。

MISAYAONE的博客 1153

栅格数据做相关性分析前的预处理(批量定义投影、栅格投影、重采样)

最近在做两个栅格数据的相关性分析,这个最主要的是两个栅格数的行列号是一致的(也就是说坐标系、分辨率一致),那么标准的栅格数据的分辨率是以米的形式存在的,但是有一些栅格数据是以度为单位存在的,所以在做分析前,一定要先把其转换为米,否则在重采样的时候就会出错。(相关文章——栅格数据以度为单位变为以米为单位的简单做法)当然,在变其分辨率的单位前,一定要将其坐标系转换为一致。所以就有以下的步骤(如何将两个栅格数据的坐标系、分辨率的单位和分辨率一致) 1.首先,要看两个栅格数据的坐标系是否一致,如果不一致,要先统一到

qq_41828818的博客 8350

【tarjan求双连通分量+染色判二分图】POJ 2942

这题debug的好郁闷啊!!!先是染色有问题,然后就是各种小错误.... 判奇圈可以用二分图标准,因为奇圈肯定不是二分图,之前还要分离各双连通分量.......染色法判二分图一定要先对分量里每一个点都染一次色再枚举任意两个相邻的点看是否有同色,就是因为这里wa了n次!!! #define N 1005 vector v[N]; vector lin[N]; int dfn[N],low[N];

leolin_的专栏 751

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

最小点基和最小权点基

  百度一下,发现这方面的资料太少。最小权点基貌似没有。  这两类问题都需要强连通分量来解决。强连通的模版(三个)在我博客的模版分类中有。点基:在有向图G=(G,V)中,B是V的子集。如果对于任意的y属于V,不属于B,都存在一个x属于B,使得x是y的前代(有一条边从x到y),则称B是一个点基。PS:做题的时候间接相连也算。也就是有一条路径从x到y。最小点基:顶点最少的点基。最小权点基:顶点对应的权...

Sinhaeng_Hhjian 687

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

有向图——最小点基和最小权点基

    考虑这样一个问题:     老师想通知他的所有学生一个消息,虽然他手上有他们的联系方式,但是一个一个联系太耗时间和电话费了。他知道其它人也有一些别人的联系方式,这样可以通知他人,再让他们去通知一下别人。现在要求出至少需要联系多少人,最少需要多少花费,使得所有的人都被通知到。     上述问题可以抽象为:图G中,每个点都有一个权值,若a能联系到b,则连边(a,b)。选出最少的点数(或者权...

yangzhongmin21的专栏 419

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

强连通------tarjan算法详解及与缩点联合运用

@强连通基本定义 什么是tarjan算法?(如何求强连通) 1.首先定义两个数组dfn和low, dfn[x]表示x节点是第几个被遍历到的。 low[x]表示包含x在内的强连通分量的dfn的最小值。(也就是说这个强连通分量中最早被遍历到的) 2,我们用一个栈stack来存储遍历到的点,再定义一个数组vis[],把当前搜到的点的入栈标记为vis[x]=1。 3,对于每一个当前节点的子节点,如果之前没...

qq_44162236的博客 349

图算法 最小权点基

/* 最小点基和最小权点基: 最小点基=从每个入度为0的SCC中任意选出一个点的集合 最小权点基=从每个入度为0的SCC中选出最小权值的点的集合 */ #include &amp;lt;iostream&amp;gt; #include &amp;lt;cstdio&amp;gt; #include &amp;lt;cstring&amp;gt; using namespace std; const int INF = 0x7f...

using namespace 数学工具构造器; 612

【HDU1827】Summer Holiday(Tarjan缩点)

啊呀这个生物啊,非常exciting

薇小薇 350

最小点基

例题 POJ 1236 点基:在有向图G=<V, E>中,B是V的子集。如果对于任意的y属于V,不属于B,都存在一个x属于B,使得x是y的前代(有一条边从x到y),则称B是一个点基。 PS:做题的时候间接相连也算。也就是有一条路径从x到y。 最小点基:顶点最少的点基。 最小权点基:顶点对应的权值之和最小的点基。(顶点权值非负) 最高强连通分量:顶点数目不能增加的强连通分量。(...

既然弱小,就只顾变强就是了 579

HDU3072 Intelligence System——强连通分量(tarjan缩点+最小生成树)

点这里 题意: 给定一个无向图,图中每条边都有一个权值,求将所有强连通分量连接起来的最小权值和。 题解: 因为两点强连通的情况下,是不计算权值的,所以题目概括起来就是求链接强连通分量的权值和。所以大体分成两步: tarjan缩点: 同一个强连通分量中是不需要计算权值的,干脆全部合并算了。 枚举: 也就十万条边,只要找到某条边,连接着两个不同的强连通分量,就要参与最小权值和的计算。 过程中犯的错: 求和: 虽然tarjan运行完之后会划分出tot个强连通分量,但是为了让这些分量连接起来只...

lllllan 217

HDU1827:Summer Holiday (最小权点基)

Problem Description: To see a World in a Grain of Sand And a Heaven in a Wild Flower, Hold Infinity in the palm of your hand And Eternity in an hour. —— William Blake 听说lcy帮大家预定了新马泰7日游,Wiskey真是高兴的夜不能寐...

qq_41997978的博客 274

hdu4005The war tarjan缩点

//给一个连通无向图,加上一条边需要删除一条边,使得这个图不连通 //删除边需要花费钱,问最少需要准备多少钱使得不论加什么边最终都可以最终删除一条边使得原图不连通 //所需要删的边一定是桥,所以先进行缩点使得其变为一棵树 //在一棵树上加一条边后使得其有一个环,删除这个环的边后其依然连通 //最坏的情况权值最小的边在这个环中,而且其必然是连接两个叶子节点,这样使得环覆盖的边尽量多 //所以可以以权值

ijbuhv的专栏 978

Tarjan算法解析:割点问题与信奥刷题实战

图论算法是计算机科学中的基础内容,其中连通性问题尤为重要。Tarjan算法通过DFS遍历和low/dfn数组的巧妙设计,能够高效识别无向图中的割点(关键节点)。该算法将时间复杂度从暴力解法的O(n(n+m))优化到O(n+m),在网络可靠性分析、社交网络关键人物识别等场景有广泛应用。对于信息学奥林匹克竞赛选手而言,掌握Tarjan算法不仅能解决P3388这类模板题,还能应对网络断点分析、关键枢纽查找等变种问题。算法实现时需注意根节点特殊处理、无向图回溯避免等细节,邻接表数据结构和IO优化对性能提升至关重要。

weixin_30861797的博客 490

hdu 3072 Intelligence System (Tarjan+Kosaraju+缩点)

题目链接:   hdu 3072 题目大意:   给定有权值有向图,并且题意满足缩点之后只有一个入度为0的点                   从该点出发,传递到所有的顶点的最小权值                   联通分量内的点之间互相传递且不需要计算权值 解题思路:   缩点后的是DAG,并且唯一入度为0的顶点                   顶点入度的边至少存在一

ンZee的解题报告 1033

图论的连通性相关

强连通:有向图中,如果任意2点都相互可达,则该图是强连通图。 强连通分量:有向图中,其强连通图子图,称为强连通分量。(缩点后每个点都原图中最大的强连通分量) 一个有向图是强连通的,等价于G中有一个回路,它至少包含每个节点一次。(只是一笔画经过所有点回到原点,点可以通过多次,不一定是一个大环,也可能是几个小环的拼接。但环上的所有点一定构成强连通分量)。 一些问题只要变成有向无环图就...

weixin_40191952的博客 857

hdu1827Summer Holiday(强连通分量-最小权点基)

Summer Holiday Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4111    Accepted Submission(s): 1853 Problem Description To see a W

常胜将军的博客 309

Caocao's Bridges HDU - 4738(Tarjan求最小权值桥值)

Problem Description Caocao was defeated by Zhuge Liang and Zhou Yu in the battle of Chibi. But he wouldn't give up. Caocao's army still was not good at water battles, so he came up with another idea....

BigZong 266
上一篇: 博弈初入门小结
下一篇: 最小树形图(有向图的最小生成树)
softwareX4
博客等级 码龄9年 21粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值