题目大意:
一些学校连成了网络, 在学校之间存在某个协议:每个学校都维护一张传送表,表明他们要负责将收到的软件传送到表中的所有学校。如果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. python计算wav的语谱图_Python实现电脑录音(含音频基础知识讲解)
  2. UML中的stereotype
  3. springboot整合shiro-关于登出时,redis中缓存没有清理干净的问题
  4. 查看mysql进程--show processlist
  5. python库怎么学啊最好_最常用的几个python库--学习引导
  6. C++随机数(rand和srand)函数用法详解
  7. 多语言网站设计需要注意的问题
  8. 【Kafka】Kafka客户端分配方案
  9. 有道单词本导出xml转换.
  10. graphpad做单因素方差分析_Graphpad做单因素方差分析步骤详解
  11. Altium Designer中的长度单位如何转换?
  12. win10 python安装以及编辑器pycharm安装
  13. Android复制assets文件到SD卡
  14. Firefox 插件 FlashGot 创建 Axel 下载任务
  15. spring boot基于Java的电影院售票与管理系统毕业设计源码011449
  16. 利用Backtrader进行期权回测之五:用backtrader_plotting查看回测结果
  17. [译]无迹卡尔曼滤波教程
  18. vmware workstation虚拟机安装Debian系统教程
  19. 网上打印店可以急速打印东西吗?
  20. 非常有用的生活小常识

热门文章

  1. Android mediaRecorder框架简述(二)
  2. Android 底部导航栏的简单实现-BottomNavigationView
  3. BZOJ-3876-支线剧情-Ahoi2014-上下界网络流
  4. hdu5441(2015长春网络赛E题)
  5. 骑士旅行pascal解题程序
  6. AtCoder AGC036E ABC String
  7. iis服务器怎样配置多张证书,IIS配置多个ssl怎么做?怎么配置?
  8. nlp mrc的损失是什么_你对NLP的迁移学习爱的有多深?21个问题弄懂最新的NLP进展...
  9. Android 网络请求HttpURLConnection 和 HttpClient详解
  10. Python 零碎信息-基础 02