时间限制: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. H264协议(转)

    码率(Bitrate).帧率(FPS).分辨率和清晰度的联系与区别:https://blog.csdn.net/pc9319/article/details/79621352 H.264编码原理以及I ...

  2. (转)LSI SAS 1068E Raid CentOS 5.5 安装实例浪潮NF5220系列 分类: linux

    新来了一批服务器,全都是清一色的国产服务器,相同的阵列卡,令人头疼的是Linux标准内核不包含该raid驱动,需要单独安装,如果是新升级内核,肯定需要编译进去该raid驱动.一.先把主板自带的驱动光盘 ...

  3. sunos kernel src

    https://github.com/eocallaghan/AuroraUX-SunOS https://github.com/zoyanhui/coroutine-libtask https:// ...

  4. [session篇]看源码学习session(一)

    假如你是使用过或学习过PHP,你一定觉得很简单.session只不过是$_SESSION就可以搞得,这还不简单只是对一个key-value就能工作了.我觉得可以大多数的phper都是这样的,这是语言本 ...

  5. [ python ] 项目一:FTP程序

    声明: 该项目参考学习地址: http://www.cnblogs.com/lianzhilei/p/5869205.html , 感谢博主分享,如有侵权,立即删除. 作业:开发一个支持多用户在线的F ...

  6. Nginx惊群处理

    惊群:是指在多线程/多进程中,当有一个客户端发生链接请求时,多线程/多进程都被唤醒,然后只仅仅有一个进程/线程处理成功,其他进程/线程还是回到睡眠状态,这种现象就是惊群. 惊群是经常发生现在serve ...

  7. Centos查找大文件的办法

    find / -size +100M -exec ls -lh {} \; # 查看整体磁盘占用df -h #切换到这块磁盘检查一下这块磁盘的哪个文件夹占用高,再逐层去查找 du -h --max-d ...

  8. BZOJ 2588: Spoj 10628. Count on a tree-可持久化线段树+LCA(点权)(树上的操作) 无语(为什么我的LCA的板子不对)

    2588: Spoj 10628. Count on a tree Time Limit: 12 Sec  Memory Limit: 128 MBSubmit: 9280  Solved: 2421 ...

  9. CodeForces 779E Bitwise Formula

    位运算,枚举. 按按分开计算,枚举$?$是$0$还是$1$,分别计算出$sum$,然后就可以知道该位需要填$1$还是$0$了. #include<map> #include<set& ...

  10. CodeForces 733D Kostya the Sculptor

    排序.把每一个长方体拆成$6$个做,然后排序做即可. #pragma comment(linker, "/STACK:1024000000,1024000000") #includ ...