1

UVA 链接:http ://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=464

我不知道我现在在做什么。我不知道为什么我会产生不正确的值。在寻找最短路径后,我打印出数组。它产生了这个:

[0, 3, 8, 8, 4]
[3, 0, 5, 11, 7]
[8, 5, 0, 9, 12]
[8, 11, 9, 0, 4]
[4, 7, 12, 4, 0]

样本输入为:

1

0 3 22 -1 4
3 0 5 -1 -1
22 5 0 9 20
-1 -1 9 0 4
4 -1 20 4 0
5 17 8 3 1
1 3
3 5
2 4

使用示例输入,我生成输出:

From 1 to 3 :
Path: 1-->2-->3

Total cost :8
From 3 to 5 :
Path: 3-->2-->5
Total cost :12

From 2 to 4 :
Path: 2-->5-->4
Total cost :11

如果我查看我的数组,它似乎是正确的。但正确答案是:

From 1 to 3 :
Path: 1-->5-->4-->3
Total cost : 21

From 3 to 5 :
Path: 3-->4-->5
Total cost : 16

From 2 to 4 :
Path: 2-->1-->5-->4
Total cost : 17

我想我错过了添加税,但我不知道在哪里添加它。我尝试在做最短路径tax[j]path[i][j]同时添加,然后减去tax[x-1]tax[y-1]x-1是我的来源,y-1是我的目的地)。它不起作用,并且弄乱了我的路径数组(它为循环提供了价值;我真的不需要那个)。我真的不知道在哪里交税。

这是我的参考代码:

import java.util.*;
public class Main{
public static final int INF = 9999999;
public static int[][] path;
public static int[][] next;
public static int[] tax;
public static void main(String[] adsf){
    Scanner pp = new Scanner(System.in);
    int testCases = pp.nextInt();
    boolean first = true;
    pp.nextLine();
    pp.nextLine();
    while(testCases-- >0){
        String[] s1 = pp.nextLine().split(" ");
        int size = s1.length;
        path = new int[size][size];
        next = new int[size][size];
        for(int i = 0; i < path.length; i++)
            Arrays.fill(path[i],INF);
        tax = new int[size];
        for(int j = 0; j < path[0].length; j++){
            path[0][j] = Integer.parseInt(s1[j]);
            if(path[0][j]==-1)
                path[0][j]=INF;
        }
        for(int i = 1; i < path.length;i++){
            s1 = pp.nextLine().split(" ");
            for(int j = 0; j < path[0].length; j++){
                path[i][j] = Integer.parseInt(s1[j]);
                if(path[i][j]==-1)
                    path[i][j]=INF;
            }
        }
        for(int k=0; k<tax.length;k++){
            tax[k] = pp.nextInt();
        } pp.nextLine();    
        apsp();
        int x,y;
        //for(int i = 0; i < size; i++)
        //System.out.println(Arrays.toString(path[i]));
        while(pp.hasNextInt()){
            if(!first)
            System.out.println();
            x=pp.nextInt();
            y=pp.nextInt();
            int cost = path[x-1][y-1];
            System.out.println("From "+x+" to "+y+" :");
            System.out.print("Path: ");
            ArrayList<Integer> print = getpath(x-1,y-1);
            for(int l = 0; l < print.size(); l++){
                System.out.print(print.get(l)+1);
                if(l!=print.size()-1) System.out.print("-->");
                else System.out.println();
            }
            System.out.println("Total cost :"+cost);
            first = false;
        }
    }
}
public static void apsp(){
    for(int k=0;k<path.length;k++){
        for(int i=0;i<path.length;i++){
            for(int j=0;j<path.length;j++){
                if (path[i][k] + path[k][j] + tax[j] < path[i][j] + tax[j]) {
                    path[i][j] = path[i][k]+path[k][j];
                    next[i][j] = k;
                } else{
                    path[i][j] = path[i][j];
                }
            }   
        }   
    }
}
public static ArrayList<Integer> getpath (int i, int j) {
    ArrayList<Integer> pat = getMidPath(i,j);
    pat.add(0,i);
    pat.add(j);
    return pat;
}
public static ArrayList<Integer> getMidPath(int i, int j){
    if(next[i][j]==0)
        return new ArrayList<Integer>();
    ArrayList<Integer> pat = new ArrayList<Integer>();
    pat.addAll(getMidPath(i,next[i][j]));
    pat.add(next[i][j]);
    pat.addAll(getMidPath(next[i][j],j));
    return pat;
}
}
4

1 回答 1

2

税收适用:

任何货物通过一个城市时,除了来源城市和目的地城市。

因此,如果您有路径:

a -> b -> c -> d

然后你应该包括路径 (a,b) + tax(b) + (b,c) + tax(c) + (c,d) 的成本。

为了在您的算法中实现这一点,您应该能够将城市税添加到路径长度中,如下所示:

如果您知道您从 a 开始并在 d 结束,那么任何到城市 x 的有向路径(其中 x 不是 a 或 b)都应该被视为 x 的成本 + 城市 x 的税收。

您需要将路径成本值恢复为您想要计算价值的下一条路径的原始值,并为新的起点和目的地重新添加税值。

于 2012-05-21T07:33:02.440 回答