Ideal Path理想路径,BFS与DFS(Java版)

非常经典的一个题目,

public class IdealPath {

    public static int[] value;    //最短路径长度
    public static int[][] g;      //矩阵图
    public static List result = new ArrayList();

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String line = scan.nextLine().trim();
        String[] params = line.split(" ");
        int n = Integer.valueOf(params[0]);
        int m = Integer.valueOf(params[1]);
        value = new int[n];
        g = new int[n][n];
        for (int i=0; i<m; i++) {
            line = scan.nextLine().trim();
            params = line.split(" ");
            int start = Integer.valueOf(params[0]) - 1;
            int end = Integer.valueOf(params[1]) - 1;
            g[start][end] = Integer.valueOf(params[2]);
        }
        for (int[] tmp: g) {
            System.out.println(Arrays.toString(tmp));
        }
        System.out.println("Original Value:" + Arrays.toString(value));

        dfs(0);
        System.out.println("Target Value:" + Arrays.toString(value));
        result.add(1);
        bfs(0, true);
        System.out.println(result);
    }

    /*
    bfs函数有两个用处,以flag来区分:
    true:选择最短路径;false:选择颜色最小序
     */
    public static int bfs(int n, boolean flag) {
        if (n == value.length-1)
            return 0;
        int next = -1;
        for (int i=0; i<value.length; i++) {
            if (value[i] == value[n] -1 && g[n][i] != 0) {
                if (next== -1 || g[n][i] < g[n][next]) {
                    next = i;
                } else if (g[n][i] == g[n][next]) {
                    int a = bfs(next, false);
                    int b = bfs(i, false);
                    next = a < b ? next : i;
                }
            }
        }
        if (flag)
            result.add(next+1);
        return g[n][next] + bfs(next, flag);
    }

    public static int dfs(int n) {
        if (n == value.length - 1)
            return 0;
        value[n] = -1;
        for (int i=0; i<value.length; i++) {
            if (g[n][i] > 0 && value[i] != -1) {
                int val = dfs(i) + 1;
                if (val < value[n] || value[n] == -1) {
                    value[n] = val;
                }
            }
        }
        return value[n];
    }



}

Java版实现如下,如果有bug或需要改进的地方,及时指出哟。可读性可能并不是很好,主要是为了秀。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值