import java.util.ArrayList;
import java.util.Scanner;
public class DangerousRatio {
/**
* 思路:令每个节点记录前一个节点,并找到所有割点,然后从最后一个点向前寻找,如果是割点,则+1
*/
private static int n,m,num[],min[],pre[],targetX,targetY,count=1;
private static DangerNode[] nodes;
public static void main(String[] args) {
// TODO 自动生成的方法存根
int time=0,a,b;
Scanner read=new Scanner(System.in);
String str=read.nextLine();
String strr[]=str.split(" ");
n=Integer.valueOf(strr[0]);
m=Integer.valueOf(strr[1]);
nodes=new DangerNode[n];
while(time<m){
str=read.nextLine();
strr=str.split(" ");
a=Integer.valueOf(strr[0]);
b=Integer.valueOf(strr[1]);
if(nodes[a-1]==null){
nodes[a-1]=new DangerNode();
}
if(nodes[b-1]==null){
nodes[b-1]=new DangerNode();
}
nodes[a-1].add(b-1);
nodes[b-1].add(a-1);
time++;
}
str=read.nextLine();
strr=str.split(" ");
targetX=Integer.valueOf(strr[0])-1;
targetY=Integer.valueOf(strr[1])-1;
dfs(targetX);
getdfs(targetY);
}
private static void getdfs(int targetY2) {
// TODO 自动生成的方法存根
int pre=nodes[targetY].pre,num=0,cur=targetY2;
while(pre>=0){
if(pre==targetX){
System.out.println(num);
return;
}
//如果是割点,并且是给出的两个点之间的割点,则+1
if(nodes[pre].point==true&&nodes[cur].min>=nodes[pre].cur){
num++;
}
cur=pre;
pre=nodes[pre].pre;
}
if(num==0){
System.out.println(-1);
}
}
private static void dfs(int pos) {
// TODO 自动生成的方法存根
int next;
nodes[pos].cur=count++;
nodes[pos].min=nodes[pos].cur;
nodes[pos].known=true;
for(int i=0;i<nodes[pos].list.size();i++){
next=nodes[pos].get(i);
if(nodes[next].known==false){
nodes[next].pre=pos;
dfs(next);
nodes[pos].min=Math.min(nodes[pos].min, nodes[next].min);
if(nodes[pos].cur<=nodes[next].min){
nodes[pos].point=true;
}
}else if(nodes[pos].pre!=next){
nodes[pos].min=Math.min(nodes[pos].min, nodes[next].cur);
}
}
}
}
class DangerNode{
int vex,cur,pre=-1,min;
boolean known=false,point=false;
ArrayList<Integer> list;
public DangerNode(){
list=new ArrayList<Integer>();
}
public void add(int e){
list.add(e);
}
public int get(int pos){
return list.get(pos);
}
}
危险系数
最新推荐文章于 2021-03-20 12:35:56 发布