Tarjan算法总结

news/2025/11/25 21:00:14/文章来源:https://www.cnblogs.com/wmmdbk/p/19270060

强联通分量

点击查看代码
#include<bits/stdc++.h>using namespace std;int n,m;
vector<int> e[10005];int dfn[10005],low[10005],timtp;
int stk[10005],stktp;
bool instk[10005];
int scccnt,inscc[10005];
vector<int> scc[10005];
bool vis[10005];void tarjan(int x){dfn[x] = low[x] = ++timtp;stk[++stktp] = x;instk[x] = 1;for(auto y:e[x]){if(!dfn[y]){tarjan(y);low[x] = min(low[x],low[y]);}else if(instk[y]) low[x] = min(low[x],dfn[y]);}if(low[x] >= dfn[x]){scccnt++;int y;do{y = stk[stktp--];instk[y] = 0;inscc[y] = scccnt;scc[scccnt].push_back(y);}while(y != x);}}signed main(){cin >> n >> m;for(int i = 1;i <= m;++ i){int u,v;cin >> u >> v;e[u].push_back(v);}for(int i = 1;i <= n;++ i)if(!dfn[i]) tarjan(i);cout << scccnt << endl;for(int i = 1;i <= n;++ i){if(vis[inscc[i]]) continue;vis[inscc[i]] = 1;int w = inscc[i];sort(scc[w].begin(),scc[w].end());for(auto x:scc[w]) cout << x << " ";cout << endl;}return 0;}

缩点

点击查看代码
#include<bits/stdc++.h>#define int long longusing namespace std;int n,m;
int a[10005];
struct bian{int u,v;
}b[100005];
vector<int> e[10005];
vector<int> e2[10005];
int a2[10005];int dfn[10005],low[10005],timtp;
int stk[10005],stktp;
int instk[10005];
int beinscc[10005];
int cntscc;
int sizscc[10005];void dfs(int x){dfn[x] = low[x] = ++timtp;stk[++stktp] = x;instk[x] = 1;for(auto y:e[x]){if(!dfn[y]){dfs(y);low[x] = min(low[x],low[y]);}else if(instk[y]) low[x] = min(low[x],dfn[y]);}if(low[x] == dfn[x]){cntscc++;int y;do{y = stk[stktp--];instk[y] = 0;sizscc[cntscc] += a[y];beinscc[y] = cntscc;}while(y != x);}}int ind[10005];
int ds[10005];signed main(){cin >> n >> m;for(int i = 1;i <= n;++ i)cin >> a[i];for(int i = 1;i <= m;++ i){int u,v;cin >> u >> v;b[i] = {u,v};e[u].push_back(v);}for(int i = 1;i <= n;++ i)if(!dfn[i]) dfs(i);for(int i = 1;i <= m;++ i){if(beinscc[b[i].u] != beinscc[b[i].v]){int u = beinscc[b[i].u];int v = beinscc[b[i].v];e2[u].push_back(v);ind[v]++;}}for(int i = 1;i <= cntscc;++ i)a2[i] = sizscc[i];queue<int> q;for(int i = 1;i <= cntscc;++ i)if(ind[i] == 0) ds[i] = a2[i],q.push(i);while(!q.empty()){int x = q.front();q.pop();for(auto y:e2[x]){ds[y] = max(ds[y],a2[y]+ds[x]);ind[y]--;if(!ind[y]) q.push(y);}}int ans = 0;for(int i = 1;i <= cntscc;++ i)ans = max(ans,ds[i]);cout << ans;return 0;}

割点

点击查看代码
#include<bits/stdc++.h>using namespace std;int n,m;
vector<int> e[20005];int dfn[20005],low[20005],timtp;
int gdcnt,isgd[20005];void tarjan(int x,int com){dfn[x] = low[x] = ++timtp;int child = 0;for(auto y:e[x]){if(!dfn[y]){tarjan(y,com);low[x] = min(low[x],low[y]);child++;if(low[y] >= dfn[x]&&x != com)gdcnt += (!isgd[x]),isgd[x] = 1;}else low[x] = min(low[x],dfn[y]);}if(x == com&&child >= 2) gdcnt += (!isgd[x]),isgd[x] = 1;}signed main(){cin >> n >> m;for(int i = 1;i <= m;++ i){int u,v;cin >> u >> v;e[u].push_back(v);e[v].push_back(u);}for(int i = 1;i <= n;++ i)if(!dfn[i]) tarjan(i,i);cout << gdcnt << endl;for(int i = 1;i <= n;++ i)if(isgd[i]) cout << i << " ";return 0;}

点双联通分量

点击查看代码
#include<bits/stdc++.h>using namespace std;int n,m;
vector<int> e[500005];int dfn[500005],low[500005],timtp;
int stk[500005],stktp;
int scccnt;
vector<int> scc[500005];void tarjan(int x,int root){dfn[x] = low[x] = ++timtp;stk[++stktp] = x;int child = 0;for(auto y:e[x]){if(!dfn[y]){tarjan(y,root);low[x] = min(low[x],low[y]);if(low[y] >= dfn[x]){scccnt++;int w;do{w = stk[stktp--];scc[scccnt].push_back(w);}while(w != y);scc[scccnt].push_back(x);}child++;}else low[x] = min(low[x],dfn[y]);}if(x == root&&child == 0)scc[++scccnt].push_back(x);}signed main(){cin >> n >> m;for(int i = 1;i <= m;++ i){int u,v;cin >> u >> v;e[u].push_back(v);e[v].push_back(u);}for(int i = 1;i <= n;++ i)if(!dfn[i]) stktp = 0,tarjan(i,i);cout << scccnt << endl;for(int i = 1;i <= scccnt;++ i){cout << scc[i].size() << " ";for(auto x:scc[i]) cout << x << " ";cout << endl;}return 0;}

边双联通分量

点击查看代码
#include<bits/stdc++.h>using namespace std;int n,m,w_wo_o;
vector<pair<int,int> > e[500005];int dfn[500005],low[500005],timtp;
int scccnt;
vector<int> scc[500005];
int stk[500005],stktp;void tarjan(int x,int com){dfn[x] = low[x] = ++timtp;stk[++stktp] = x;for(auto [y,whe]:e[x]){if(!dfn[y]){tarjan(y,whe);low[x] = min(low[x],low[y]);}else if(whe != (com^1)) low[x] = min(low[x],dfn[y]);}if(low[x] == dfn[x]){scccnt++;int w;do{w = stk[stktp--];scc[scccnt].push_back(w);}while(w != x);}}signed main(){cin >> n >> m;for(int i = 1;i <= m;++ i){int u,v;cin >> u >> v;e[u].push_back({v,w_wo_o++});e[v].push_back({u,w_wo_o++});}for(int i = 1;i <= n;++ i)if(!dfn[i]) stktp = 0,tarjan(i,-1);cout << scccnt << endl;for(int i = 1;i <= scccnt;++ i){cout << scc[i].size() << " ";for(auto x:scc[i]) cout << x << " ";cout << endl;}return 0;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/976484.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【CV】【IRSRMamba】basicSR库

介绍IRSRMamba模型中的basicSR库的代码结构

2025年11月十大效果图公司推荐榜单:专业分析与权威评测对比

在建筑设计与地产开发领域,效果图是项目沟通与决策的重要媒介。无论是建筑师、开发商还是项目业主,在推进项目时往往面临选择合适效果图公司的难题。用户可能因项目汇报、营销宣传或方案比选等需求,寻求高品质的视觉…

2025 年 11 月管道更換服務權威推薦榜:專業施工與高效維修,涵蓋老舊破損無縫防腐耐高溫管道更換,包括自來水消防燃氣排水污水工業通風等各類室內外場景

2025 年 11 月管道更換服務權威推薦榜:專業施工與高效維修,涵蓋老舊破損無縫防腐耐高溫管道更換,包括自來水消防燃氣排水污水工業通風等各類室內外場景 行業背景分析 管道系統作為城市基礎設施與建築物的重要組成部…

L12_自定义接口与权限验证_从零开始

作业ppt演示过程实操 由于点意外,导致部分若依菜单无法打开,并且由于强迫症,全删,从零开始 来点音乐:终焉的莉莉 准备阶段 环境:mysql,redis,jdk-18,nvm,node 16,idea打开ruoyi.vip 选择源码地址,选择ruoyi前后端…

leetcode238. 除自身以外数组的乘积 未解决

leetcode238. 除自身以外数组的乘积 未解决238. 除自身以外数组的乘积只会违规使用除法🤡class Solution {public int[] productExceptSelf(int[] nums) {int product = 1,firstZero = -1,secondZero = -1,n = nums…

python environment settings

Install python https://www.python.org/for example: python-3.14.0-amd64.exeinstall List all python installed in local machine> py -0 -V:3.14 * Python 3.14 (64-bit) -V:3.13 Python 3.13…

2025 年 11 月靶材廠家權威推薦榜:濺射/磁控濺射/旋轉靶材,ITO/半導體/光學鍍膜,陶瓷/金屬/鈦/鋁/銅/鎢/鉬/鉭/矽/合金/稀土靶材精選,工藝精湛與創新應用深度解析

2025 年 11 月靶材廠家權威推薦榜:濺射/磁控濺射/旋轉靶材,ITO/半導體/光學鍍膜,陶瓷/金屬/鈦/鋁/銅/鎢/鉬/鉭/矽/合金/稀土靶材精選,工藝精湛與創新應用深度解析 行業發展現狀與技術趨勢 隨著全球高科技產業的快速…

2025 年 11 月高壓清洗服務廠家推薦排行榜,管道/下水道/污水管/市政管道高壓清洗,化糞池/隔油池/污水池專業清洗,家庭/商鋪/小區/工廠高效深度清潔首選!

2025 年 11 月高壓清洗服務廠家推薦排行榜,管道/下水道/污水管/市政管道高壓清洗,化糞池/隔油池/污水池專業清洗,家庭/商鋪/小區/工廠高效深度清潔首選! 行業背景分析 高壓清洗技術作為現代化清潔維護的重要組成部…

如何在C++中实现面向对象编程?

C++ 面向对象编程(OOP)的核心是 封装、继承、多态,通过 class 关键字定义类,将数据(成员变量)和操作(成员函数)绑定在一起,同时支持派生类扩展基类、虚函数实现动态行为。以下是具体实现方法和示例: 一、封装…

2025 年 11 月鍍膜材料源頭廠家權威推薦榜:真空鍍膜材料、光學鍍膜材料、金屬鍍膜材料,高效能與耐用性深度解析

2025 年 11 月鍍膜材料源頭廠家權威推薦榜:真空鍍膜材料、光學鍍膜材料、金屬鍍膜材料,高效能與耐用性深度解析 前言:鍍膜材料產業發展現狀與技術趨勢 隨著全球高科技製造業的快速發展,鍍膜材料作為關鍵基礎材料,…

一物一码赋能全链路管控,二脉科技互动溯源系统引领行业新生态 !

在假冒伪劣产品频发、市场窜货乱象丛生的当下,防伪溯源成为企业守护品牌信誉、保障消费者权益的核心防线。防伪溯源、追溯系统、追溯防窜货等需求日益迫切,而防伪追溯、防伪码溯源码、追溯码、一物一码二维码追溯等技…

最简单的畅通工程

1.千万别忘记路径压缩:顺便把经历的父节点给变成根节点 2.道路=独立的-1 3.最后判断fa==i就是独立的 不用find一开始的初始化不就是这样的么 #include <bits/stdc++.h> using namespace std; int fa[10005]; in…

高级程序语言设计第七次

这个作业属于:https://edu.cnblogs.com/campus/fzu/gjyycx 这个作业的要求:https://edu.cnblogs.com/campus/fzu/gjyycx/homework/15587 学号:102500416 姓名:王浩宇 第一题第二题第三题第四题第五题第六题第七题第…

有限元技巧核心原理与学习路径:从一维基础到多维拓展(七步流程)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

唯物辩证法3大观点11原理

一、联系的观点 1、联系的普遍性和客观性原理世界上的一切事物都处于普遍联系之中,其中没有任何一个事物是孤立存在的,整个世界就是一个普遍联系的统一整体。 事物的联系又是客观的,不以人的意识为转移,人们不能否…

实用指南:面向高并发场景的舆情处置技术实践——基于字节探索Infoseek的架构拆解

实用指南:面向高并发场景的舆情处置技术实践——基于字节探索Infoseek的架构拆解2025-11-25 20:40 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overf…

Day48(18)-F:\硕士阶段\Java\课程代码\后端\web-ai-code\web-ai-project02\tlias-web-management

异常管理package com.itheima.exception;import com.itheima.pojo.Result; import lombok.extern.slf4j.Slf4j; import org.springframework.dao.DuplicateKeyException; import org.springframework.web.bind.annotat…

习题解析之:模拟生成微软序列号

习题解析之:模拟生成微软序列号【问题描述】 微软产品一般都有一个25位的序列号,用来区分每份微软产品。产品序列号由五组被“-”分隔开,由字母数字混合编制的字符串组成,每组字符串是由五个字符串组成。如: 36XJ…

sg 多堆的取石子游戏

我们的sg正宗适用题目来啦 #include <bits/stdc++.h> using namespace std; vector<int>k; int f[105]; int sg(int x) {if(f[x]!=-1) return f[x];set<int>s;for(auto it:k){if(it>x) continue;…

日总结 31

Launch4j 核心使用指南(Java 客户端打包成.exe) Launch4j 是 Java 客户端打包成 Windows .exe 最常用的开源工具,核心是将可运行 JAR 包封装为原生 exe,支持绑定 JRE、自定义图标、配置启动参数,无需用户手动安装…