时人


私信TA

用户名:17633532082

访问量:3493

签 名:

等  级
排  名 11885
经  验 1003
参赛次数 0
文章发表 9
年  龄 0
在职情况 学生
学  校 河南大学
专  业

  自我简介:

解题思路:

    所谓关键点既是所有可行的路径都要经过该点,因此,采用深度搜索的方式找到每条路径,并记录路径上的点的访问次数,若二者相同,则为关键点。本人先将通道转化成邻接表,再用DFS寻找路径,同时利用桶思想记录节点访问的次数。


注意事项:

参考代码:

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;

public class 关键点 {
    private static HashSet<Integer>[] sets; // 邻接表
    private static ArrayList<Integer> parents = new ArrayList<>();  // 记录之前已遍历过的结点
    private static ArrayList<Integer> routes = new ArrayList<>();   // 记录路径上的结点,不记录头尾
    private static int[] index; //  节点桶,记录路径上的点访问的次数
    private static int count = 0;   //  记录路径的个数
    private static int start;
    private static int end;
    public static void main(String[] args){
        int num = 0;    // 记录关键节点的个数
        Scanner reader = new Scanner(System.in);
        int station_num = reader.nextInt(); // 站点数
        int route_num = reader.nextInt();   // 通道数
        sets = new HashSet[station_num+1];
        index = new int[station_num+1];
        for(int i=1;i<=station_num;i++){
            sets[i] = new HashSet<>();
        }
        for(int i=0;i<route_num;i++){   //建立邻接表
            int former = reader.nextInt();
            int later = reader.nextInt();
            sets[former].add(later);
            sets[later].add(former);
        }
        start = reader.nextInt();   // 起始站点
        end = reader.nextInt(); // 终点
        if(sets[start].isEmpty()||sets[end].isEmpty()){ //  如果起始站点或终点没有其他点相连,则输出-1
            System.out.println(-1);
        }else{
            DFS(start); // 深度搜索,寻找路径
            if(count == 0) {    // 若未找到路径,则输出-1
                System.out.println(-1);

            }else {
                for(int i=1;i<=station_num;i++){    // 若路径上的点的访问次数与路径数相同,则该点是关键点
                    if (index[i] == count)
                        num ++;
                }
                System.out.println(num);
            }

        }

    }

    private static void DFS(int start) {
        Iterator<Integer> iterator = sets[start].iterator();
        parents.add(start);
        while (iterator.hasNext()){ //遍历邻接节点
            int next = iterator.next();
            if(parents.contains(next))continue; //如果已访问过则不再访问
            if(next == end){    // 找到目标则记录起来每个节点访问的次数及路径数
                for(int e : routes)
                    index[e] ++;
                count ++;
            }
            routes.add(next);
            DFS(next);
            parents.remove(parents.size()-1);   // 向上弹出一层,则将该点释放掉,因为还可能从其他路径访问
            routes.remove(routes.size()-1); //  向上弹出,说明该点要么不是路径上的点,要么是已访问过路径上的点,不再记录
        }
        return;
    }
}


 

0.0分

0 人评分

  评论区

  • «
  • »