土下座しながら探索中

主に競技プログラミング

AOJ 2151: Brave Princess Revisited

問題リンク : Brave Princess Revisited | Aizu Online Judge

問題概要 : 本文を参照してもらいたい。。。

使用した言語 : Java

解法 :
int used[今いる宿][今もってるお金] := 襲われた数の最小 として Dijkstraしました。 
護衛を雇えるなら雇った場合と雇わない場合をキューに入れていきました。

困ったこと :

1. listで2次配列を作る際にWarningが出まくった
原因と解決策 : @SuppressWarnings("unchecked")というものをつけた。これをつけると""で囲んだ警告を無視してくれるそうな。。。

2. java.lang.ClassCastExceptionが出まくった
原因と解決策 : 自作のクラスでプライオリティキューを使っていたが、その順位付けの基準を実装していなかった。自作のクラスを使用する場合には Comparableを implements しないといけないみたいだ。

コメント:
Javaを本格的につかいはじめてまだ2週間なのでJavaの仕様で苦労した。下記のコードでは15.16秒という驚異的なタイムをたたき出してしまった。Javaに詳しくなってから原因を探してみようとおもう。


コード :

import java.util.*;
import java.lang.*;
import java.io.*;
 
class Main{
 
    private static int[][] used;
    private static int N,M,L;
    private static List<Pox>[] list;
    private static final int INF = 100000000;
 
    private static class Pox{
    public int B,D,E;
    Pox(){
        B = D = E = 0;
    }
 
    Pox(int b,int d,int e){
        B = b;
        D = d;
        E = e;
    }
    }
 
    private static class Eleac implements Comparable<Eleac>{
    public int id,L,num;
 
    Eleac(){
        id = L = num = 0;
    }
 
    Eleac(int a,int b,int c){
        id = a;
        L = b;
        num = c;
    }
 
    @Override
    public int compareTo(Eleac a){
        return 1;
    }
 
    }
 
     @SuppressWarnings("unchecked")
      public static void main(String args[])throws IOException{
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
       
      while(true)
          {
          String[] elements = in.readLine().split(" ");
          N = Integer.parseInt(elements[0]);
          M = Integer.parseInt(elements[1]);
          L = Integer.parseInt(elements[2]);
          if(N == 0 && M == 0 && L == 0)
              break;
 
           
 
          used = new int[N+1][L+1];
          list = new ArrayList[N+2];
 
          for(int i=0;i<N+1;i++)
              for(int j=0;j<L+1;j++)
              used[i][j] = INF;
 
          for(int i=0;i<N+1;i++)
              list[i] = new ArrayList<Pox>();
           
          for(int i=0;i<M;i++)
              {
             elements = in.readLine().split(" ");
             int A,B,D,E;
              A = Integer.parseInt(elements[0]);
              B = Integer.parseInt(elements[1]);
              D = Integer.parseInt(elements[2]);
              E = Integer.parseInt(elements[3]);
 
              list[A].add(new Pox(B,D,E));  
              list[B].add(new Pox(A,D,E));
              }
 
          Queue<Eleac> que = new PriorityQueue<Eleac>();
 
          que.offer(new Eleac(1,L,0)); //Eleac(id,money,the number of eemy)
          used[1][L] = 0;       
 
          int men = INF;
          while(que.size() > 0)
              {
              Eleac p = que.poll(); 
              int now = p.id;
              int money = p.L;
              int val = p.num;
               
              if(now == N)
                  {
                  used[now][money] = Math.min(used[now][money],val);    
                  continue;
                  }
               
              
              for(int i=0;i<list[now].size();i++)
                  {
                  int need = list[now].get(i).D;
 
                  int new_pos = list[now].get(i).B;
                  int the_number = list[now].get(i).E;
                   
                  if(money-need >= 0 && used[new_pos][money-need] > val)
                      {
                      used[new_pos][money-need] = val;
                      que.add(new Eleac(new_pos,money-need,val));
                      }                 
                  if(used[new_pos][money] > val+the_number)
                      {
                      used[new_pos][money] = val+the_number;
                      que.add(new Eleac(new_pos,money,val+the_number));
                      }
 
                  }
 
               
              }
 
          for(int i=0;i<=L;i++)
              {
              men = Math.min(men,used[N][i]);
              }
          System.out.println(men);
          }
      }
 
}