危险系数

来源:互联网 发布:js 点击保存图片 编辑:程序博客网 时间:2024/04/30 06:17
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;}//如果是割点,并且是给出的两个点之间的割点,则+1if(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);}}

原创粉丝点击