日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU 1385 Minimum Transport Cost

發布時間:2025/3/15 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU 1385 Minimum Transport Cost 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

HDU 1385 Minimum Transport Cost

  • 我的WA代碼
  • AC的代碼

我的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;// flodyprivate 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的代碼就改了一下,人家的思路是這樣的!!!沒太看的明白,不過語義上的理解就是:

  • 首先,如果有一條直通的邊,就直接簡單的將路徑設置為“目的點”。
  • 如果遇到一個“中間點”,那么我們將記錄i->j的“起始點”,這個起始點是path[k][j]。
  • 上面兩條語義合起來看,就能夠明白大致的意思:path[i][j]記錄的是i->j的第一個節點
  • 假設i->j的第一個節點為k,那么接下來我們只需要知道k->j的路徑了
  • 一直重復第4步操作,最后到k==j停止
  • import java.util.Scanner;public class Main {private final static int INF = 9999999;// flodyprivate 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();} }

    總結

    以上是生活随笔為你收集整理的HDU 1385 Minimum Transport Cost的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。