当前位置: 首页 > news >正文

tarjan找SCC,缩点建DAG,找唯一源头节点

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using PII = pair<int,int>;
using EDGE = tuple<int,int,ll>;
const int N = 2e4 + 10;
const ll INF = 1e9 + 7;
//存图
int n,m;
vector<int>G[N];//tarjan
int dfn[N],low[N];
int timer;
stack<int>S;
bool instack[N];//染色,建立新图
int col[N];
int scc_cnt;
int in[N];
int pts[N];//每个大点节点数void tarjan(int cur)
{dfn[cur] = low[cur] = ++timer;S.push(cur);instack[cur] = true;for(int nxt:G[cur]){if(dfn[nxt] == 0){tarjan(nxt);low[cur] = min(low[cur],low[nxt]);}else if(instack[nxt])low[cur] = min(low[cur],dfn[nxt]);}if(dfn[cur] == low[cur]){scc_cnt ++;while(true){int topval = S.top();S.pop();instack[topval] = false;col[topval] = scc_cnt;if(topval == cur)break;}}
}void happy_every_day()
{cin >> n >> m;for(int i = 1;i <= m;i ++){int u,v;cin >> u >> v;G[v].push_back(u);//[USACO03FALL / HAOI2006] 受欢迎的牛G 记录反图}//tarjan找SCCfor(int i = 1;i <= n; i++)if(dfn[i] == 0)tarjan(i);//记录缩点后每个点的小点个数//SCC缩点set<PII>edges;for(int i = 1;i <= n;i ++){pts[col[i]] ++;for(int j:G[i]){if(col[i] == col[j])continue;edges.insert({col[i],col[j]});}}for(auto [u,v]:edges)in[v] ++;//找一个入度为0的大点int res = 0;for(int i = 1;i <= scc_cnt;i ++){if(in[i] == 0){if(res != 0){cout << 0 << endl;return;}else res = pts[i];}}cout << res << endl;
}int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int t;t = 1;while(t --){happy_every_day();}return 0;
}

http://www.dtcms.com/a/316728.html

相关文章:

  • 强光干扰下误报率↓82%!陌讯多模态融合算法在火焰识别的落地优化
  • 不可变集合
  • nflsoi 7.31 题解
  • 信息化项目验收,项目成功的最后确认
  • Redis中的sdshdr的len和alloc那块的知识点详解
  • 【经验记录贴】在windows系统中启动服务
  • CMU-15445(7)——PROJECT#2-BPlusTree-Task#2Task#3
  • BGA 芯片贴片加工关键注意事项
  • Fiddler 中文版实战指南,如何构建高效的 API 调试工作流?
  • 第13届蓝桥杯Scratch_选拔赛_真题2021年11月27日
  • 老旧体育场馆照明翻新:预算有限?3 步实现 “低成本升级”
  • 在具身智能火热加持下,看 2025 年机器人学术年会中的热点主题。PNP机器人展示力控、灵巧手捕捉等案例。
  • 利用链上数据进行数字资产量化因子发现
  • 计划任务:被忽视的网络与系统安全边界
  • Linux-Day10.系统安全保护web服务管理
  • 【springcloud的配置文件不生效】
  • Linux系统:基础I/O
  • 【RK3576】【Android14】Uboot下fastboot命令支持
  • 闸机控制系统从设计到实现全解析:第 4 篇:Redis 缓存与分布式锁实现
  • JavaScript 概述
  • Linux 逻辑卷管理:LVM 原理与 Stratis、VDO 特性对比
  • Vue2博客项目笔记(第一天)
  • 防御保护3-4
  • STM32CubeIDE新建项目过程记录备忘(八)使用通用定时器中断生成PWM波形
  • LINUX 85 SHElL if else 前瞻 实例
  • MLS学习
  • vue3 计算属性
  • Docker 容器内进行 frp 内网穿透
  • 关于怎么知道linux(ubuntu)系统交叉编译器的命令的方法:
  • web-vue工作流程