poj1236-Tarjan算法
题目大意:
一些学校连成了网络, 在学校之间存在某个协议:每个学校都维护一张传送表,表明他们要负责将收到的软件传送到表中的所有学校。如果A在B的表中,那么B不一定在A的表中。
现在的任务就是,给出所有学校及他们维护的表,问1、如果所有学校都要被传送到,那么需要几份软件备份;2、如果只用一份软件备份,那么需要添加几条边?
题解:
1.即求强联通分量的个数,或者说是缩点以后入度为0的个数。
2.所有学校都连成一个强联通分量,只需要将图中的强联通分量互相之间联通就好了。添加的边数就是缩点后入度为0的点和出度为0的点的最大值。
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;#define MAXN 110
#define INF 0x3f3f3f3f
int n;
int map[MAXN][MAXN];
int low[MAXN];
int dfn[MAXN];
int stack[MAXN], head;
int instack[MAXN];
int belong[MAXN];
int in[MAXN];
int out[MAXN];
int index, cnt;int min(int a, int b)
{return a < b ? a : b;
}int max(int a, int b)
{return a > b ? a : b;
}void init()
{int i, j;int temp;memset(map, 0, sizeof(map));memset(dfn, -1, sizeof(dfn));memset(low, 0, sizeof(low));memset(instack, 0, sizeof(instack));index = cnt = 1;head = 0;for(i= 1; i <= n; i++){while(scanf("%d", &temp) && temp){map[i][temp] = 1;}}
} void tarjan(int x)
{int i, a;low[x] = dfn[x] = index; // 刚搜到一个节点时low = dfnindex++;stack[++head] = x; // 将该节点入栈 instack[x] = 1; // 将入栈标记设置为1for(i = 1; i <= n; i++) // 遍历入栈节点的边{if(!map[x][i]) // 如果两点之间没有边continue; // 不用管它if(dfn[i] == -1) // 如果新搜索到的节点是从未被搜索过{tarjan(i); // 那自然就得搜索这个节点low[x] = min(low[x], low[i]); // 回溯的时候改变当前节点的low值 }else if(instack[i]) // 如果新搜索到的节点已经被搜索过而且现在在栈中 {low[x] = min(low[x], dfn[i]); // 更新当前节点的low值,这里的意思是两个节点之间有一条可达边,而前面 } // 而前面节点已经在栈中,那么后面的节点就可能和前面的节点在一个联通分量中 } if(low[x] == dfn[x]) // 最终退回来的时候 low == dfn , 没有节点能将根节点更新,那 { // low == dfn 的节点必然就是根节点int temp; while(1) // 一直出栈到此节点, 这些元素是一个强联通分量 {temp = stack[head--]; // 弹出栈元素 belong[temp] = cnt; // 为了方便计算,将强联通分量进行标记instack[temp] = 0; // 将栈内标记置为0 if(temp == x) // 一直弹到x出现为止 break;}cnt++;}
} void solve()
{int i, j;int t1, t2;while(scanf("%d", &n) != EOF) //{init(); // 初始化 for(i = 1; i <= n; i++) // if(dfn[i] == -1) // 如果某点没被访问过,则对其进行tarjan tarjan(i); // tarjan的成果是得到了一个belong数组,记录每个节点分别属于哪个强联通分量 **for(i = 1; i <= n; i++) // 遍历每条边,找到缩点之后的边 {for(j = 1;j <= n; j++){if(map[i][j] && belong[i] != belong[j]) // 两点之间有边,但不是属于一个强联通分量的边{out[belong[i]]++; // 缩点后的点入度+1 in[belong[j]]++;// 缩点后的点出度+1 } } }** //缩点t1 = 0, t2 = 0;for(i = 1; i < cnt; i++){if(in[i] == 0)t1++;if(out[i] == 0)t2++;}if(cnt == 2)printf("1\n0\n");elseprintf("%d\n%d\n", t1, max(t1, t2));//缩点后入度为0的点和出度为0的点的最大值}
}int main()
{
#ifdef LOCALfreopen("poj1236.txt", "r", stdin);// freopen(".txt", "w", stdout);
#endifsolve();return 0;
}
转载于:https://www.cnblogs.com/luckycode/p/5255650.html
poj1236-Tarjan算法相关推荐
- poj1236 Tarjan算法模板 详解
思想: 做一遍DFS,用dfn[i]表示编号为i的节点在DFS过程中的访问序号(也可以叫做开始时间)用low[i]表示i节点DFS过程中i的下方节点所能到达的开始时间最早的节点的开始时间.初始时dfn ...
- poj1236+la4287【tarjan算法】
学习了一下tarjan求有向图强连通分量算法. 最后果断发现LRJ的白书就是... 然后发现百度百科上面那个tarjan算法图讲解还是不错的吧. 个人感觉理解度 80%应该有了. 深受各种大牛不看题 ...
- tarjan算法不是很懂先mark一下。
前面为转载的.后面是自己的理解. 三种tarjan算法(上) .这篇算是做一个总结吧. 求强连通分量 求无向图的割和桥 最近公共祖先 求强连通分量 基本概念: 强连通是有向图才有的概念. ...
- Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)...
转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2194090a96bbed2db1351de8.html 基本概念: 1.割点:若删掉某点后,原连通图 ...
- 0x66.图论 - Tarjan算法与无向图连通性
目录 一.无向图的割点与桥 割点 桥/割边 时间戳 搜索树 追溯值 二.割边判定法则 三.割点判定法则 1.luogu P3388 [模板]割点(割顶) 2.luogu P3469 [POI2008] ...
- 『Tarjan算法 无向图的双联通分量』
无向图的双连通分量 定义:若一张无向连通图不存在割点,则称它为"点双连通图".若一张无向连通图不存在割边,则称它为"边双连通图". 无向图图的极大点双连通子图被 ...
- Tarjan算法学习笔记
一种由Robert Tarjan提出的求解有向图强连通分量的线性时间的算法. [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected ...
- 『追捕盗贼 Tarjan算法』
追捕盗贼(COCI2007) Description 为了帮助警察抓住在逃的罪犯,你发明了一个新的计算机系统.警察控制的区域有N个城市,城市之间有E条双向边连接,城市编号为1到N. 警察经常想在罪犯从 ...
- 算法提高课-图论-有向图的强连通分量-AcWing 367. 学校网络:强连通分量、tarjan算法
文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 第一问:通过tarjan算法求出强连通分量并且缩点后,统计入度为0的点的个数p即可. 第二问,至少加几条边才能使图变成强连通分量?这 ...
- CSP认证201509-4 高速公路[C++题解]:强连通分量、tarjan算法模板题
题目分析 来源:acwing 分析: 所求即为强连通分量的个数,然后计算每个强连通分量中点的个数,相加即可. 所谓强连通分量,它是一个子图,其中任意两点可以相互到达,并且再加一个点,就不能满足任意两点 ...
最新文章
- C#面向插件级别的软件开发 - 开源研究系列文章
- 简单的树形dp NOJ376 小强的Linux
- sigmoid函数的数值稳定性
- 【python】编程学习练习题-2
- Opencv--直线拟合
- 使用Maven构建Struts2项目
- java代理模式与装饰者模式
- js高级学习笔记(b站尚硅谷)-1-数据类型
- MacBookPro安装JDK环境
- 单片机定时器一1ms12MHz_单片机原理及接口技术笔记1单片机概述
- 小学计算机专业说课稿模板,小学信息技术说课稿模板汇总八篇
- 电路原理图(SCH)相关知识详解
- ARC下循环引用的问题
- spring整合shiro权限管理与数据库设计
- 100个优秀jQuery插件精选
- 隐式转换、IF判断、逻辑【与、或、非】、三目运算的用法(基础)
- 神经网络基础学习小记
- 远程控制软件支持linux,Linux下5款远程桌面软件
- 机器学习算法拾遗:(七)隐马尔科夫模型(前向后向算法、鲍姆-韦尔奇算法、维特比算法)
- 中国传媒大学博士申请初试准备经验(文科+工科)(2022)
热门文章
- Android Bitmap面面观
- flume采集最简demo
- 加载svr模型_机器学习XGBoost实战,网格搜索自动调参,对比随机森林,线性回归,SVR【完整代码(含注释)+数据集见原文链接】...
- css 透明_css属性transparent有时候并不是透明的
- myelicesp stepover不能点_市区6处垃圾临时转运点被撤销
- 期待的程序员的生活并非你想象的那么简单!
- 合法的python变量名import_python 环境变量和import模块导入方法(详解)
- 服务器部署的参数文档,服务器的基本配置参数
- IDE硬盘,SATA硬盘,SCSI硬盘有什么区别
- BZOJ-1857-传送带-SCOI2010