题目大意:
一些学校连成了网络, 在学校之间存在某个协议:每个学校都维护一张传送表,表明他们要负责将收到的软件传送到表中的所有学校。如果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算法相关推荐

  1. poj1236 Tarjan算法模板 详解

    思想: 做一遍DFS,用dfn[i]表示编号为i的节点在DFS过程中的访问序号(也可以叫做开始时间)用low[i]表示i节点DFS过程中i的下方节点所能到达的开始时间最早的节点的开始时间.初始时dfn ...

  2. poj1236+la4287【tarjan算法】

    学习了一下tarjan求有向图强连通分量算法. 最后果断发现LRJ的白书就是... 然后发现百度百科上面那个tarjan算法图讲解还是不错的吧.  个人感觉理解度 80%应该有了. 深受各种大牛不看题 ...

  3. tarjan算法不是很懂先mark一下。

     前面为转载的.后面是自己的理解. 三种tarjan算法(上) .这篇算是做一个总结吧. 求强连通分量 求无向图的割和桥 最近公共祖先 求强连通分量 基本概念:       强连通是有向图才有的概念. ...

  4. Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)...

    转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2194090a96bbed2db1351de8.html 基本概念: 1.割点:若删掉某点后,原连通图 ...

  5. 0x66.图论 - Tarjan算法与无向图连通性

    目录 一.无向图的割点与桥 割点 桥/割边 时间戳 搜索树 追溯值 二.割边判定法则 三.割点判定法则 1.luogu P3388 [模板]割点(割顶) 2.luogu P3469 [POI2008] ...

  6. 『Tarjan算法 无向图的双联通分量』

    无向图的双连通分量 定义:若一张无向连通图不存在割点,则称它为"点双连通图".若一张无向连通图不存在割边,则称它为"边双连通图". 无向图图的极大点双连通子图被 ...

  7. Tarjan算法学习笔记

    一种由Robert Tarjan提出的求解有向图强连通分量的线性时间的算法. [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected ...

  8. 『追捕盗贼 Tarjan算法』

    追捕盗贼(COCI2007) Description 为了帮助警察抓住在逃的罪犯,你发明了一个新的计算机系统.警察控制的区域有N个城市,城市之间有E条双向边连接,城市编号为1到N. 警察经常想在罪犯从 ...

  9. 算法提高课-图论-有向图的强连通分量-AcWing 367. 学校网络:强连通分量、tarjan算法

    文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 第一问:通过tarjan算法求出强连通分量并且缩点后,统计入度为0的点的个数p即可. 第二问,至少加几条边才能使图变成强连通分量?这 ...

  10. CSP认证201509-4 高速公路[C++题解]:强连通分量、tarjan算法模板题

    题目分析 来源:acwing 分析: 所求即为强连通分量的个数,然后计算每个强连通分量中点的个数,相加即可. 所谓强连通分量,它是一个子图,其中任意两点可以相互到达,并且再加一个点,就不能满足任意两点 ...

最新文章

  1. C#面向插件级别的软件开发 - 开源研究系列文章
  2. 简单的树形dp NOJ376 小强的Linux
  3. sigmoid函数的数值稳定性
  4. 【python】编程学习练习题-2
  5. Opencv--直线拟合
  6. 使用Maven构建Struts2项目
  7. java代理模式与装饰者模式
  8. js高级学习笔记(b站尚硅谷)-1-数据类型
  9. MacBookPro安装JDK环境
  10. 单片机定时器一1ms12MHz_单片机原理及接口技术笔记1单片机概述
  11. 小学计算机专业说课稿模板,小学信息技术说课稿模板汇总八篇
  12. 电路原理图(SCH)相关知识详解
  13. ARC下循环引用的问题
  14. spring整合shiro权限管理与数据库设计
  15. 100个优秀jQuery插件精选
  16. 隐式转换、IF判断、逻辑【与、或、非】、三目运算的用法(基础)
  17. 神经网络基础学习小记
  18. 远程控制软件支持linux,Linux下5款远程桌面软件
  19. 机器学习算法拾遗:(七)隐马尔科夫模型(前向后向算法、鲍姆-韦尔奇算法、维特比算法)
  20. 中国传媒大学博士申请初试准备经验(文科+工科)(2022)

热门文章

  1. Android Bitmap面面观
  2. flume采集最简demo
  3. 加载svr模型_机器学习XGBoost实战,网格搜索自动调参,对比随机森林,线性回归,SVR【完整代码(含注释)+数据集见原文链接】...
  4. css 透明_css属性transparent有时候并不是透明的
  5. myelicesp stepover不能点_市区6处垃圾临时转运点被撤销
  6. 期待的程序员的生活并非你想象的那么简单!
  7. 合法的python变量名import_python 环境变量和import模块导入方法(详解)
  8. 服务器部署的参数文档,服务器的基本配置参数
  9. IDE硬盘,SATA硬盘,SCSI硬盘有什么区别
  10. BZOJ-1857-传送带-SCOI2010