时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

还记得上次小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 4
 import 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: 连通图的更多相关文章

  1. BZOJ 3237: [Ahoi2013]连通图

    3237: [Ahoi2013]连通图 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1161  Solved: 399[Submit][Status ...

  2. dfs判断连通图(无向)

    在图论中,连通图基于连通的概念.在一个无向图 G 中,若从顶点vi到顶点vj有路径相连(当然从vj到vi也一定有路径),则称vi和vj是连通的.如果 G 是有向图,那么连接vi和vj的路径中所有的边都 ...

  3. bfs判断连通图(无向)

    在图论中,连通图基于连通的概念.在一个无向图 G 中,若从顶点vi到顶点vj有路径相连(当然从vj到vi也一定有路径),则称vi和vj是连通的.如果 G 是有向图,那么连接vi和vj的路径中所有的边都 ...

  4. 【DP】HIHO 1078

    HIHO #1037 : 数字三角形 题意:中文题就不说了. 思路:提示也很清楚,就这里贴一下代码.注意边界情况. dp[i][j] = max(dp[i-1][j],dp[i-1][j-1])+ma ...

  5. hiho一下21周 线段树的区间修改 离散化

    离散化 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在回国之后,重新过起了朝7晚5的学生生活,当然了,他们还是在一直学习着各种算法~ 这天小Hi和小Ho ...

  6. hiho #1283 hiho密码 [Offer收割]编程练习赛3

    #1283 : hiho密码 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho根据最近在密码学课上学习到的知识,开发出了一款hiho密码,这款密码的秘钥是这样生成的 ...

  7. hiho一下 第九十五周 数论四·扩展欧几里德

    题目 : 数论四·扩展欧几里德 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho周末在公园溜达.公园有一堆围成环形的石板,小Hi和小Ho分别站在不同的石板上 ...

  8. POJ2762 Going from u to v or from v to u?(判定单连通图:强连通分量+缩点+拓扑排序)

    这道题要判断一张有向图是否是单连通图,即图中是否任意两点u和v都存在u到v或v到u的路径. 方法是,找出图中所有强连通分量,强连通分量上的点肯定也是满足单连通性的,然后对强连通分量进行缩点,缩点后就变 ...

  9. hiho 毁灭者问题

    描述 在 Warcraft III 之冰封王座中,毁灭者是不死族打三本后期时的一个魔法飞行单位. 毁灭者的核心技能之一,叫做魔法吸收(Absorb Mana): 现在让我们来考虑下面的问题: 假设你拥 ...

随机推荐

  1. qgis 插件开发

    qgis 插件开发 http://blog.csdn.net/v6543210/article/details/40480341

  2. Mac OSX下Appium驱动iPhone真机

    1.安装Xcode.Command Line Tools和Appium. 2.安装brew:/usr/bin/ruby -e "$(curl -fsSL https://raw.github ...

  3. 浮动的div无论窗口大小变化都能居中显示的js

    当div是浮动的时候浏览器窗口发生变化的时候不能居中显示(因为浮动的时候一般设定的有left或者right值) 可以先用jquery获取外围的div随浏览器变化而变化的宽度(加上监听事件) 之后再获取 ...

  4. lnmp的安装--php

    1.下载php源码 wget http://cn2.php.net/distributions/php-5.6.3.tar.gz tar zxvf php-5.6.3.tar.gz cd php-5. ...

  5. NEERC 2016-2017 Probelm G. Game on Graph

    title: NEERC 2016-2017 Probelm G. Game on Graph data: 2018-3-3 22:25:40 tags: 博弈论 with draw 拓扑排序 cat ...

  6. MySQL索引基础知识点

    什么是索引 索引类似于书本目录,是数据库存储引擎维护的用于快速查找到记录的一种数据结构,它是对查询性能优化的最有效手段. MySQL索引是在存储引擎层而不是服务器层实现的,不同存储引擎的索引工作方式也 ...

  7. hdu 2147(巴什博弈+NP图)

    kiki's game Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 40000/10000 K (Java/Others)Total ...

  8. hdu 1547(BFS)

    Bubble Shooter Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  9. 计算机编码中的换行 CR与LF

    以下的文字为转载,但是有错误的地方,博主自行进行了修正和补充,用红色标示. 原文地址在这里. ------------ 转载起始 ------------- “回车”(Carriage Return) ...

  10. 【Hibernate3.3复习知识点二】 - 配置hibernate环境(annotations)

    配置文件hibernate.cfg.xml中引入:<mapping class="com.bjsxt.hibernate.Teacher"/> <hibernat ...