HDU 1385 Minimum Transport Cost

HDU 1385 Minimum Transport Cost

我的WA代码

我的大概思路就是,如果i->j,如果找到一个中间点k就直接简单的将path[i][j]=k,这样我们在遍历的时候就可以直接找到中间点k,然后通过一个递归的中序遍历的到i->k再到k->j这条路径。但是错了!!!

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
    
    private final static int INF = 9999999;
    
    // flody
    private final static int[][] flody(int[][] map, int[] city, int n) {
        int[][] path = new int[n+1][n+1];
        for(int i=1;i<=n;i++) {
            Arrays.fill(path[i], -1);
        }
        int tmp;
        for(int k=1;k<=n;k++) {
            for(int i=1;i<=n;i++) {
                if(map[i][k] == INF)
                    continue;
                for(int j=1;j<=n;j++) {
                    tmp = map[i][k] + map[k][j]+city[k];
                    if(map[i][j] > tmp) {
                        map[i][j] = tmp;
                        path[i][j] = k;
                    }else if(map[i][j] == tmp && path[i][j] > k) {
                        path[i][j] = k;
                    }
                }
            }
        }
        return path;
    }
    
    private final static void printFlody(int[][] path, int s, int e) {
        System.out.println(String.format("From %d to %d :", s, e));
        if(s == e) {
            System.out.println(String.format("Path: %d", s));
            return;
        }
        
        System.out.print(String.format("Path: %d-->", s));
        ArrayList<Integer> list = new ArrayList<>();
        middle(list, path, s, e);
        for(Integer u : list) {
            System.out.print(String.format("%d-->", u));
        }
        System.out.println(e);
    }
    
    private final static void middle(ArrayList<Integer> list, int[][] path, int i, int j) {
        int k = path[i][j];
        if(k == -1)
            return;
        middle(list, path, i, k);
        list.add(k);
        middle(list, path, k, j);
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n;
        int[][] map;
        int[] city;
        int s, e;
        while(true) {
            n = sc.nextInt();
            if(n == 0) {
                break;
            }
            map = new int[n+1][n+1];
            for(int i=1;i<=n;i++) {
                for(int j=1;j<=n;j++) {
                    map[i][j] = sc.nextInt();
                    if(map[i][j] == -1)
                        map[i][j] = INF;
                }
            }
            city = new int[n+1];
            for(int i=1;i<=n;i++) {
                city[i] = sc.nextInt();
            }
            int[][] flody = flody(map, city, n);
            while(true) {
                s = sc.nextInt();
                e = sc.nextInt();
                if(s == -1 && e == -1) {
                    break;
                }
                printFlody(flody, s, e);
                System.out.println(String.format("Total cost : %d", map[s][e]));
                System.out.println();
            }
        }
        sc.close();
    }
}

AC的代码

于是最后AC的代码就改了一下,人家的思路是这样的!!!没太看的明白,不过语义上的理解就是:

  1. 首先,如果有一条直通的边,就直接简单的将路径设置为“目的点”。
  2. 如果遇到一个“中间点”,那么我们将记录i->j的“起始点”,这个起始点是path[k][j]
  3. 上面两条语义合起来看,就能够明白大致的意思:path[i][j]记录的是i->j的第一个节点
  4. 假设i->j第一个节点为k,那么接下来我们只需要知道k->j的路径了
  5. 一直重复第4步操作,最后到k==j停止
import java.util.Scanner;

public class Main {
	
	private final static int INF = 9999999;
	
	// flody
	private final static int[][] flody(int[][] map, int[] city, int n) {
		int[][] path = new int[n+1][n+1];
		for(int i=1;i<=n;i++) {
			for(int j=1;j<=n;j++) {
				if(map[i][j] != INF) {
					path[i][j] = j;
				}
			}
		}
		int tmp;
		for(int k=1;k<=n;k++) {
			for(int i=1;i<=n;i++) {
				if(map[i][k] == INF)
					continue;
				for(int j=1;j<=n;j++) {
					tmp = map[i][k] + map[k][j]+city[k];
					if(map[i][j] > tmp) {
						map[i][j] = tmp;
						path[i][j] = path[i][k];
					}else if(map[i][j] == tmp && path[i][j] > path[i][k]) {
						path[i][j] = path[i][k];
					}
				}
			}
		}
		return path;
	}
	
	private final static void printFlody(int[][] path, int s, int e) {
		System.out.println(String.format("From %d to %d :", s, e));
		
		System.out.print(String.format("Path: %d", s));
		while(s!=e) {
			System.out.print(String.format("-->%d", path[s][e]));
			s = path[s][e];
		}
		System.out.println();
	}
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n;
		int[][] map;
		int[] city;
		int s, e;
		while(true) {
			n = sc.nextInt();
			if(n == 0) {
				break;
			}
			map = new int[n+1][n+1];
			for(int i=1;i<=n;i++) {
				for(int j=1;j<=n;j++) {
					map[i][j] = sc.nextInt();
					if(map[i][j] == -1)
						map[i][j] = INF;
				}
			}
			city = new int[n+1];
			for(int i=1;i<=n;i++) {
				city[i] = sc.nextInt();
			}
			int[][] flody = flody(map, city, n);
			while(true) {
				s = sc.nextInt();
				e = sc.nextInt();
				if(s == -1 && e == -1) {
					break;
				}
				printFlody(flody, s, e);
				System.out.println(String.format("Total cost : %d", map[s][e]));
				System.out.println();
			}
		}
		sc.close();
	}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
众所周知,人工智能是当前最热门的话题之一, 计算机技术与互联网技术的快速发展更是将对人工智能的研究推向一个新的高潮。 人工智能是研究模拟和扩展人类智能的理论与方法及其应用的一门新兴技术科学。 作为人工智能核心研究领域之一的机器学习, 其研究动机是为了使计算机系统具有人的学习能力以实现人工智能。 那么, 什么是机器学习呢? 机器学习 (Machine Learning) 是对研究问题进行模型假设,利用计算机从训练数据中学习得到模型参数,并最终对数据进行预测和分析的一门学科。 机器学习的用途 机器学习是一种通用的数据处理技术,其包含了大量的学习算法。不同的学习算法在不同的行业及应用中能够表现出不同的性能和优势。目前,机器学习已成功地应用于下列领域: 互联网领域----语音识别、搜索引擎、语言翻译、垃圾邮件过滤、自然语言处理等 生物领域----基因序列分析、DNA 序列预测、蛋白质结构预测等 自动化领域----人脸识别、无人驾驶技术、图像处理、信号处理等 金融领域----证券市场分析、信用卡欺诈检测等 医学领域----疾病鉴别/诊断、流行病爆发预测等 刑侦领域----潜在犯罪识别与预测、模拟人工智能侦探等 新闻领域----新闻推荐系统等 游戏领域----游戏战略规划等 从上述所列举的应用可知,机器学习正在成为各行各业都会经常使用到的分析工具,尤其是在各领域数据量爆炸的今天,各行业都希望通过数据处理与分析手段,得到数据中有价值的信息,以便明确客户的需求和指引企业的发展。
众所周知,人工智能是当前最热门的话题之一, 计算机技术与互联网技术的快速发展更是将对人工智能的研究推向一个新的高潮。 人工智能是研究模拟和扩展人类智能的理论与方法及其应用的一门新兴技术科学。 作为人工智能核心研究领域之一的机器学习, 其研究动机是为了使计算机系统具有人的学习能力以实现人工智能。 那么, 什么是机器学习呢? 机器学习 (Machine Learning) 是对研究问题进行模型假设,利用计算机从训练数据中学习得到模型参数,并最终对数据进行预测和分析的一门学科。 机器学习的用途 机器学习是一种通用的数据处理技术,其包含了大量的学习算法。不同的学习算法在不同的行业及应用中能够表现出不同的性能和优势。目前,机器学习已成功地应用于下列领域: 互联网领域----语音识别、搜索引擎、语言翻译、垃圾邮件过滤、自然语言处理等 生物领域----基因序列分析、DNA 序列预测、蛋白质结构预测等 自动化领域----人脸识别、无人驾驶技术、图像处理、信号处理等 金融领域----证券市场分析、信用卡欺诈检测等 医学领域----疾病鉴别/诊断、流行病爆发预测等 刑侦领域----潜在犯罪识别与预测、模拟人工智能侦探等 新闻领域----新闻推荐系统等 游戏领域----游戏战略规划等 从上述所列举的应用可知,机器学习正在成为各行各业都会经常使用到的分析工具,尤其是在各领域数据量爆炸的今天,各行业都希望通过数据处理与分析手段,得到数据中有价值的信息,以便明确客户的需求和指引企业的发展。
众所周知,人工智能是当前最热门的话题之一, 计算机技术与互联网技术的快速发展更是将对人工智能的研究推向一个新的高潮。 人工智能是研究模拟和扩展人类智能的理论与方法及其应用的一门新兴技术科学。 作为人工智能核心研究领域之一的机器学习, 其研究动机是为了使计算机系统具有人的学习能力以实现人工智能。 那么, 什么是机器学习呢? 机器学习 (Machine Learning) 是对研究问题进行模型假设,利用计算机从训练数据中学习得到模型参数,并最终对数据进行预测和分析的一门学科。 机器学习的用途 机器学习是一种通用的数据处理技术,其包含了大量的学习算法。不同的学习算法在不同的行业及应用中能够表现出不同的性能和优势。目前,机器学习已成功地应用于下列领域: 互联网领域----语音识别、搜索引擎、语言翻译、垃圾邮件过滤、自然语言处理等 生物领域----基因序列分析、DNA 序列预测、蛋白质结构预测等 自动化领域----人脸识别、无人驾驶技术、图像处理、信号处理等 金融领域----证券市场分析、信用卡欺诈检测等 医学领域----疾病鉴别/诊断、流行病爆发预测等 刑侦领域----潜在犯罪识别与预测、模拟人工智能侦探等 新闻领域----新闻推荐系统等 游戏领域----游戏战略规划等 从上述所列举的应用可知,机器学习正在成为各行各业都会经常使用到的分析工具,尤其是在各领域数据量爆炸的今天,各行业都希望通过数据处理与分析手段,得到数据中有价值的信息,以便明确客户的需求和指引企业的发展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值