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

校园网--tarjan求缩点的两个经典问题

1.入度为0点通知全部

2.DAG变SCC,别忘了特判称环的情况

P2746 [USACO5.3] 校园网Network of Schools - 洛谷

#include<bits/stdc++.h>
using namespace std;
#define N 100011
typedef  long long ll;
typedef pair<ll,int> pii;
int n;
vector<int> mp[105],p[105];
int cnt,c; 
int low[105],dfn[105],sd[105];
stack<int> st;
void tarjan(int i)///tarjan缩点,即将强连通分量看成一个点 
{low[i]=dfn[i]=++cnt;st.push(i);for(int v:mp[i]){if(!dfn[v]){tarjan(v);low[i]=min(low[i],low[v]);}elseif(!sd[v]) low[i]=min(low[i],dfn[v]);}if(low[i]==dfn[i]){sd[i]=++c;while(st.top()!=i){sd[st.top()]=c;st.pop();}st.pop();}
}
int in[105],nn,ou[105];
int cc,mm;
int main() {ios::sync_with_stdio(0);cin.tie(0);//cout.tie(0);cin>>n;for(int i=1;i<=n;i++){int x;while(cin>>x&&x){mp[i].push_back(x);}}for(int i=1;i<=n;i++){if(!dfn[i]){tarjan(i);}}for(int i=1;i<=n;i++){for(int v:mp[i]){if(sd[i]!=sd[v]){p[sd[i]].push_back(sd[v]);in[sd[v]]++;ou[sd[i]]++;}}}if(c==1)///特判成环的情况{cout<<1<<"\n"<<0;	} else///问题1:刻录光盘/受欢迎的牛--入度为0点通知全部问题 ///问题2:正常DAG(有向无环图)变SCC(强连通分图)///max{in为0的点个数与out度为0的个数 }{for(int i=1;i<=c;i++){if(!in[i]) nn++;if(!ou[i]) mm++;}cout<<nn<<endl;cout<<max(nn,mm);}return 0;
}

http://www.xdnf.cn/news/7204.html

相关文章:

  • 《Python星球日记》 第90天:微调的概念以及如何微调大模型?
  • CCpro工程编程软件
  • 二:操作系统之进程的创建与终止
  • CVE-2018-1273源码分析与漏洞复现
  • 76.有符号数累加运算
  • c++进阶——位图、布隆过滤器
  • 菜鸟之路Day32一一多表查询,事物,索引
  • 【Linux网络】五种IO模型与阻塞IO
  • 多模态信息提取:打通数据价值的“最后一公里”
  • Linux进程信号(二)之信号产生1
  • 【Linux】第二十章 管理基本存储
  • Redis进阶知识
  • 数据库blog2_数据结构与效率
  • 选择之困:如何挑选合适的 Python 环境与工具——以 Google Colaboratory 为例
  • 0-1背包问题(求最优值和构造最优解)
  • 苍穹外卖--修改菜品
  • C++中的四种强制转换
  • web中路径问题
  • Leetcode134加油站
  • u深度学习 神经网络图像数据的预处理全解
  • RDD-数据清洗
  • 02 Nginx虚拟主机
  • 【Linux】第十七章 归档和传输文件
  • 为什么el-select组件在下拉选择后无法赋值
  • 机器学习西瓜书
  • 我的电赛(简易的波形发生器大一暑假回顾)
  • 字节跳动开源通用图像定制模型DreamO,支持风格转换、换衣、身份定制、多条件组合等多种功能~
  • 【android bluetooth 协议分析 01】【HCI 层介绍 4】【LeSetEventMask命令介绍】
  • 【C语言】字符串函数及其部分模拟实现
  • JavaScript:元宇宙角色动作与移动