nyist120 校园网络 (Tarjan算法 / 强连通分量)
校园网络(nyist 120)
解题思路请看代码块中的注释~
import java.util.Scanner;
import java.util.Stack;
import java.util.Vector;/**考点:强连通分量* 考查算法:Tarjan算法* 解析:* 本题需要求给定的有向图中有多少个强连通分量,* 然后将强连通分量缩点,* 最后求缩点后的有向无环图中,* 需要添加多少条边,* 可以再次生成一个强连通图* 添加的边数为缩点后的有向无环图的出度为0的点的个数与入度为0的点的个数的最大值* 即 MAX(zeroOutNumber,zeroInNumber)* 当缩点后只有一个点时,需要特判一下,即输出结果就是0,不需要添加边*/
public class NYIST120强连通分量 {static Vector<Integer>[]vectors;static int[]dfn,low,vis,components;static int num, componentNumber;static Stack<Integer>stack;public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int T = scanner.nextInt();while (T-->0){int n = scanner.nextInt();vectors = new Vector[n+1];componentNumber = 0;for (int i = 1; i <= n; i++){vectors[i] = new Vector<Integer>();int x = scanner.nextInt();while (x != 0){vectors[i].add(x);x = scanner.nextInt();}}stack = new Stack<Integer>();dfn = new int[n+1];low = new int[n+1];vis = new int[n+1];components = new int[n+1];num = 0;for (int i = 1; i <= n; i++){if (dfn[i]==0){Tarjan(i);}}if (componentNumber == 1){System.out.printf("0\n");continue;}int []out = new int[componentNumber+1];int []in = new int[componentNumber+1];for (int i = 1; i<= n; i++){for (Integer v: vectors[i]){if (components[i] != components[v]){out[components[i]]++;in[components[v]]++;}}}int zeroOutNumber = 0, zeroInNumber = 0;for (int i = 1; i <= componentNumber; i++){if (out[i] == 0)zeroOutNumber ++;if (out[i] == 0)zeroInNumber ++;}System.out.print(String.format("%d\n",Math.max(zeroOutNumber, zeroInNumber)));}}private static void Tarjan(int u) {dfn[u] = low[u] = ++num;stack.add(u);vis[u] = 1;for (int i = 0; i < vectors[u].size(); i++){int v = vectors[u].get(i);if (dfn[v] == 0){Tarjan(v);low[u] = Math.min(low[u],low[v]);}else if (vis[v] == 1){low[u] = Math.min(low[u], dfn[v]);}}if (low[u] == dfn[u]){int temp;componentNumber++;do {temp = stack.pop();vis[temp] = 0;components[temp] = componentNumber;}while (temp != u);}}
}
nyist120 校园网络 (Tarjan算法 / 强连通分量)相关推荐
- `Computer-Algorithm` Tarjan算法,强连通分量SCC,PBCC割点,EBCC割边/桥
Contents EBCC 例题 PBCC 涉及割点/PBCC时的解决思路 例题 SCC 过去分析 例题 EBCC Some properties of the algorithm: + for a ...
- Tarjan有向图强连通分量
Tarjan有向图强连通分量 本文仅供娱乐,不喜勿喷 一.强连通分量 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi ...
- hdu 1269 tarjan求强连通分量
tarjan求强连通分量的裸题复习,可当做模板. 1 #include <stack> 2 #include <cstdio> 3 #include <cstring&g ...
- The King’s Problem(tarjan求强连通分量缩点+匈牙利求有向无环图的最小路径覆盖)
Link:http://acm.hdu.edu.cn/showproblem.php?pid=3861 The King's Problem Time Limit: 2000/1000 MS (Jav ...
- 洛谷 P2921 在农场万圣节Trick or Treat on the Farm (tarjan求强连通分量)
洛谷 P2921 在农场万圣节Trick or Treat on the Farm (tarjan求强连通分量) 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N&l ...
- P1262 间谍网络 (Tarjan 求强连通分量)
题目传送门:https://www.luogu.com.cn/problem/P1262 题意 题意转换成图的角度理解,给出初始可以访问的节点 D i D_i Di 以及访问这些节点需要的代价 W ...
- tarjan求强连通分量的思考
我是按照这里的思路来的.这个博文只是感性理解. 递归树 关于递归树,这篇博文讲的很好,我只是给自己总结一下. 定义vis数组,在dfs连通图时赋予它们不同的含义: vis=0,表示这个点没有被访问. ...
- hdu 1269(Tarjan求强连通分量)
这道题目就是求强连通分量... 这里采用的是Tarjan算法:http://m.blog.csdn.net/blog/qq574857122/16361033 AC代码: #include<io ...
- HDU-1269 Tarjan求强连通分量,模板题
HDU 1269 题意:n个点m条单向边,问任意两个点是否连通. 总结:参考大神博客码的,有些地方还是不太明白. 而且这题还可以双向dfs做,有时间再做一下. // HDU-1269 #include ...
最新文章
- 计算机电缆线对成缆系数,计算机电缆绞合系数 - 无图版
- MIT给人工智能“泼冷水”:AI创造性目前有限
- Nginx虚拟机主机根据不同的域名使用不同的root路径
- .Net 2.0 新功能:迭代器(Iterators)
- 动态调用WCF不添加服务(svcutil.exe)
- ERROR 1436 (HY000) at line 1943
- 购买台式计算机方案,购买电脑的注意事项有哪些?
- java编译_解析 Java 即时编译器原理。
- 用几个最简单的例子带你入门 Python 爬虫
- vue-cli入门之项目结构分析
- OpenCV-Android平台应用实战 - 银行卡卡号识别(01、环境搭建)
- 网络拓扑图自动生成_SAP ABAP关键字语法图和ABAP代码自动生成工具Code Composer
- 拓嘉启远:拼多多店铺子账号设置,提高店铺效率
- 全微分的充分条件和必要条件
- 安装office2010失败,提示因为安装了office2010早期试用版本或在安装过程中出错
- 尚硅谷javaWeb书城项目第一阶段 用js实现
- kubernetes笔记
- Android图片处理(Matrix,ColorMatrix,深入讲解Android
- Python+os+openpyxl 批量获取Excel的文件名和最大行数
- 防火墙、DCD与TCP Keep alive