Hiho: 连通图
描述
还记得上次小Hi和小Ho学校被黑客攻击的事情么,那一次攻击最后造成了学校网络数据的丢失。为了避免再次出现这样的情况,学校决定对校园网络进行重新设计。
学校现在一共拥有N台服务器(编号1..N)以及M条连接,保证了任意两台服务器之间都能够通过连接直接或者间接的数据通讯。
当发生黑客攻击时,学校会立刻切断网络中的一条连接或是立刻关闭一台服务器,使得整个网络被隔离成两个独立的部分。
举个例子,对于以下的网络:
每两个点之间至少有一条路径连通,当切断边(3,4)的时候,可以发现,整个网络被隔离为{1,2,3},{4,5,6}两个部分:
若关闭服务器3,则整个网络被隔离为{1,2},{4,5,6}两个部分:
小Hi和小Ho想要知道,在学校的网络中有哪些连接和哪些点被关闭后,能够使得整个网络被隔离为两个部分。
在上面的例子中,满足条件的有边(3,4),点3和点4。
输入
第1行:2个正整数,N,M。表示点的数量N,边的数量M。1≤N≤20,000, 1≤M≤100,000
第2..M+1行:2个正整数,u,v。表示存在一条边(u,v),连接了u,v两台服务器。1≤u<v≤N
保证输入所有点之间至少有一条连通路径。
输出
第1行:若干整数,用空格隔开,表示满足要求的服务器编号。从小到大排列。若没有满足要求的点,该行输出Null
第2..k行:每行2个整数,(u,v)表示满足要求的边,u<v。所有边根据u的大小排序,u小的排在前,当u相同时,v小的排在前面。若没有满足要求的边,则不输出
- 样例输入
-
6 7
1 2
1 3
2 3
3 4
4 5
4 6
5 6 - 样例输出
-
3 4
3 4import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
import java.util.Stack;
import java.util.TreeSet; public class Main { static int N_Max=0; //记录根节点是否有两个或多个子树
static int NUM=0; //记录已经遍历的个数
static int [] checktable;
static int [] havechecktable;
static Stack<Integer> stack=new Stack();
public static void main(String[] argv){
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int M = in.nextInt();
checktable= new int[N]; //记录遍历顺序
havechecktable= new int[N]; //记录是否已经遍历的标示
int[] y_min= new int[N]; //记录非树边所能达到的小次序值
int[] min = new int[N]; //记录Low值
int[] sort_check = new int[N];//记录每个id点的遍历次序
ArrayList<Integer> [] source = new ArrayList[N]; //记录图的矩阵
ArrayList<Integer> [] blue = new ArrayList[N]; //记录遍历树的矩阵
Set<String> out_xian = new HashSet<String>();
Set<Integer> out_dian = new HashSet<Integer>();
ArrayList<Integer> [] out_xian_2 = new ArrayList[N];
int[][] xian_resource = new int[N][N];
//ArrayList<Integer> out_dian = new ArrayList<Integer>();
//ArrayList out_xian = new ArrayList();
//初始化矩阵
for(int i=0; i<N; i++){
source[i] = new ArrayList<Integer>();
blue[i] = new ArrayList<Integer>();
out_xian_2[i] = new ArrayList<Integer>();
}
/************************记录矩阵**********************/
for(int i=0; i<M; i++){
int x=in.nextInt()-1; int y= in.nextInt()-1;
source[x].add(y);
source[y].add(x);
}
/************************深度遍历**********************/
dfn(source, checktable, blue); /************************验证非树边**********************/
/*
//System.out.println("BLUE: ");
for(int i=0; i<N; i++){ System.out.println(" "+blue[i].toString());
}
*/
/************************get sort_check[](即 dfn[])**********************/
for(int i=0; i<N; i++){
source[i].removeAll(blue[i]);
sort_check[checktable[i]]=i;
}
/************************验证dfn[] and y_min[]**********************/
/*
System.out.println("Sort_Check: ");
for(int i=0; i<N; i++){
System.out.println(" "+sort_check[i]);
}
System.out.println("YELLOW: ");
for(int i=0; i<N; i++){
System.out.println(source[i].toString());
}
*/
/************************Get the y_low[]**********************/
//System.out.println("YELLOW_min: ");
for(int i=0; i<N; i++){
int ymin=i;
for(Object k: source[checktable[i]]){
int spit = sort_check[(int)k];
if(spit<ymin)
ymin=spit;
}
//System.out.print(" "+ymin);
y_min[i]=ymin;
}
/************************Get the low[]**********************/
//System.out.println();
//System.out.println("Low: ");
for(int i=N-1; i>=0; i--){
int k_low = checktable[i];
min[i]=y_min[i];
for(Object o_int : blue[k_low] ){ if(sort_check[k_low]<sort_check[(int)o_int]){ if(min[i]>min[sort_check[(int)o_int]])
min[i]=min[sort_check[(int)o_int]];
}
}
// Low[]
//System.out.println(" "+i+" "+k_low+": "+min[i]);
}
/************************Get result**********************/
for(int i=0; i<N; i++){ for(Object blue_k : blue[i]){ //System.out.println(i+": "+min[sort_check[(int)blue_k]]+">="+sort_check[i]);
if(min[sort_check[(int)blue_k]]>=sort_check[i]){
//System.out.println(i+" added. ");
if(i>0)
out_dian.add(i+1);
if(min[sort_check[(int)blue_k]]>sort_check[i]){
//String temp = "";
int x=i+1;
int y=(int)blue_k+1;
if(i<(int)blue_k){
//temp=x+" "+y;
out_xian_2[i].add((int)blue_k);
}
else{
//temp=y+" "+x;
out_xian_2[(int)blue_k].add(i);
} }
}
}
}
if(N_Max>1)
out_dian.add(1);
//System.out.println(out_dian.toString());
/************************Output result**********************/
java.util.Iterator<Integer> it_dian=out_dian.iterator();
//java.util.Iterator<String> it_xian=out_xian.iterator();
int[] dian_sqit_list = new int[N+1];
String dian_result="";
while(it_dian.hasNext())
{
dian_sqit_list[it_dian.next()]=1;
//dian_result=dian_result+it_dian.next()+" ";
}
for(int i=1; i<=N; i++){
if(dian_sqit_list[i]==1)
dian_result=dian_result+i+" ";
}
//System.out.println("::::::"+dian_result);
if(dian_result.length()>1){
dian_result=dian_result.substring(0,dian_result.length()-1);
System.out.println(dian_result);
}
else
System.out.println("Null"); for(int i=0; i<N; i++){ int[] out_xian_temp = new int[N];
for(int out_m : out_xian_2[i]){ out_xian_temp[out_m]=1; }
for(int j=0; j<N;j++ ){ if(out_xian_temp[j]==1){
System.out.print(i+1);
System.out.print(" ");
System.out.println(j+1);
} } } /*
while(it_xian.hasNext())
{
System.out.println(it_xian.next());
}
*/
} public static void dfn(ArrayList[] source, int[] checktable, ArrayList[] blue){ //int size = source.length;
int start =0;
checktable[NUM++]=start;
havechecktable[start]=1;
stack.push(start);
while(true){ int end = Had(source[start],start,checktable,havechecktable);
if(end>=0){
if(start==0)
N_Max++;
blue[start].add(end);
blue[end].add(start);
//System.out.println(end);
stack.push(end);
//stack.push(start);
//start = end;
//System.out.println("start:"+start+" end"+end+" "+"NUM:"+NUM);
checktable[NUM++]=end;
havechecktable[end]=1;
}
else{ stack.pop();
}
if(stack.isEmpty())
break;
else{
start=stack.pop();
stack.push(start);
} }
//System.out.println(N_Max); } public static int Had(ArrayList s_source, int s_check, int[] check_table, int[] havechecked){ for(int i=0; i<s_source.size();i++){
//System.out.println(s_source.toString());
int key = (int)s_source.get(i);
//System.out.println(key);
if(havechecked[key]==0){
return key;
}
} return -1;
}
}
Hiho: 连通图的更多相关文章
- BZOJ 3237: [Ahoi2013]连通图
3237: [Ahoi2013]连通图 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1161 Solved: 399[Submit][Status ...
- dfs判断连通图(无向)
在图论中,连通图基于连通的概念.在一个无向图 G 中,若从顶点vi到顶点vj有路径相连(当然从vj到vi也一定有路径),则称vi和vj是连通的.如果 G 是有向图,那么连接vi和vj的路径中所有的边都 ...
- bfs判断连通图(无向)
在图论中,连通图基于连通的概念.在一个无向图 G 中,若从顶点vi到顶点vj有路径相连(当然从vj到vi也一定有路径),则称vi和vj是连通的.如果 G 是有向图,那么连接vi和vj的路径中所有的边都 ...
- 【DP】HIHO 1078
HIHO #1037 : 数字三角形 题意:中文题就不说了. 思路:提示也很清楚,就这里贴一下代码.注意边界情况. dp[i][j] = max(dp[i-1][j],dp[i-1][j-1])+ma ...
- hiho一下21周 线段树的区间修改 离散化
离散化 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在回国之后,重新过起了朝7晚5的学生生活,当然了,他们还是在一直学习着各种算法~ 这天小Hi和小Ho ...
- hiho #1283 hiho密码 [Offer收割]编程练习赛3
#1283 : hiho密码 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho根据最近在密码学课上学习到的知识,开发出了一款hiho密码,这款密码的秘钥是这样生成的 ...
- hiho一下 第九十五周 数论四·扩展欧几里德
题目 : 数论四·扩展欧几里德 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho周末在公园溜达.公园有一堆围成环形的石板,小Hi和小Ho分别站在不同的石板上 ...
- POJ2762 Going from u to v or from v to u?(判定单连通图:强连通分量+缩点+拓扑排序)
这道题要判断一张有向图是否是单连通图,即图中是否任意两点u和v都存在u到v或v到u的路径. 方法是,找出图中所有强连通分量,强连通分量上的点肯定也是满足单连通性的,然后对强连通分量进行缩点,缩点后就变 ...
- hiho 毁灭者问题
描述 在 Warcraft III 之冰封王座中,毁灭者是不死族打三本后期时的一个魔法飞行单位. 毁灭者的核心技能之一,叫做魔法吸收(Absorb Mana): 现在让我们来考虑下面的问题: 假设你拥 ...
随机推荐
- 增大dma的分配
前言 项目中需要通过驱动与fpga通讯,获取fpga往内存里写的数据.因为数据量比较大,需要驱动分配600多M的内存给fpga来写数据,且因为是与fpga通讯,需要连续的内存,还得是uncached的 ...
- monkey测试===easyMonkey测试【推荐】
easymonkey测试: easymonkey是基于monkey测试的一个二次开发工具.(关于monkey测试参见之前blog) easymonkey的特点就是方便,解决了很多参数命令上设置的麻烦, ...
- (转)关于bootstrap, boosting, bagging,Rand forest
转自:https://blog.csdn.net/jlei_apple/article/details/8168856 这两天在看关于boosting算法时,看到一篇不错的文章讲bootstrap, ...
- webapi-2 接口参数
1. 实例 using System; using System.Collections.Generic; using System.Linq; using System.Net; using Sys ...
- JDBC数据源连接池(3)---Tomcat集成DBCP
此文续<JDBC数据源连接池(2)---C3P0>. Apache Tomcat作为一款JavaWeb服务器,内置了DBCP数据源连接池.在使用中,只要进行相应配置即可. 首先,确保Web ...
- Struts2学习笔记01 之 简介及配置
一.Struts简介 * 是轻量级的MVC框架,主要解决了请求分发的问题,重心在控制层和表现层.运用ASOP的思想,使用拦截器来扩展业务控制器 二.使用步骤: 1.引入Sturts2的相关JAR包 2 ...
- Java之static理解
说到关键字static,首先想到了常量,静态变量,本文我总结了下static的用法. 1.静态变量 可以被赋值,便于类访问. 2.静态方法 静态方法与静态变量都可以被private.public修饰. ...
- LintCode 13. Implement strStr()
LintCode 13. Implement strStr() 题目描述 对于一个给定的 source 字符串和一个 target 字符串,你应该在 source 字符串中找出 target 字符串出 ...
- 转:攻击JavaWeb应用[4]-SQL注入[2]
转:http://static.hx99.net/static/drops/tips-288.html 攻击JavaWeb应用[4]-SQL注入[2] 园长 · 2013/07/18 17:23 注: ...
- python判断一个对象是可迭代?
1.介绍一下如何判断一个对象是可迭代的? 通过collections模块的Iterable类型判断: >>> from collections import Iterable > ...