时间限制: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. Caffe学习笔记4图像特征进行可视化

    Caffe学习笔记4图像特征进行可视化 本文为原创作品,未经本人同意,禁止转载,禁止用于商业用途!本人对博客使用拥有最终解释权 欢迎关注我的博客:http://blog.csdn.net/hit201 ...

  2. MACACA===gradle下载和安装

    gradle下载地址: http://services.gradle.org/distributions/ 或者直接点击这个: http://services.gradle.org/distribut ...

  3. Linux内核死锁检测机制【转】

    转自:http://www.oenhan.com/kernel-deadlock-check 死锁就是多个进程(线程)因为等待别的进程已占有的自己所需要的资源而陷入阻塞的一种状态,死锁状态一旦形成,进 ...

  4. MinnowBoard

    MinnowBoard https://github.com/RafaelRMachado/MinnowBoard https://github.com/RafaelRMachado https:// ...

  5. ogre3d环境配置 SDK安装配置及简单事例教程

    ogre3d环境配置 SDK安装配置及简单事例教程 http://www.cr173.com/html/22594_1.html ogre3d环境配置 SDK安装配置及简单事例教程 http://ww ...

  6. SSH认证原理和批量分发管理

    SSH密码认证原理 几点说明: 1.服务端/etc/ssh目录下有三对公钥私钥: [root@m01 ssh]# ls moduli ssh_config sshd_config ssh_host_d ...

  7. LightOJ - 1234

    Harmonic Number Time Limit: 3000MS   Memory Limit: 32768KB   64bit IO Format: %lld & %llu Descri ...

  8. IntelliJ IDEA SpringBoot 使用第三方Tomcat以及部署

    花了半天时间终于成功,记录以备查阅. 一.第三方Tomcat部署 部署部分参考的是:把spring-boot项目部署到tomcat容器中 目标:把spring-boot项目按照平常的web项目一样发布 ...

  9. python math模块

    import math math. ceil:取大于等于x的最小的整数值,如果x是一个整数,则返回x copysign:把y的正负号加到x前面,可以使用0 cos:求x的余弦,x必须是弧度 degre ...

  10. Python3发送qq邮件,测试通过

    import smtplib from email.mime.text import MIMEText # 收件人列表 mail_namelist = ["10402852@qq.com&q ...