質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

1370閲覧

これは何をしているのですか?

gyro16

総合スコア89

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2017/04/27 02:54

編集2017/04/27 03:05

###前提・実現したいこと

これは何をしているのですか?

elem.get(1).set(elem.get(elem.size()-1));

###発生している問題・エラーメッセージ

エラーメッセージ

###該当のソースコード

java

1import java.util.*; 2 3public class Algo44{ 4 5 public static void main(String[] args){ 6 7 Scanner scan = new Scanner(System.in); 8 int n = scan.nextInt(); 9 SSSPath sp = new SSSPath(n); 10 11 for(int i = 0; i < n; i++){ 12 int u = scan.nextInt(); 13 int k = scan.nextInt(); 14 for(int j = 0; j < k; j++) 15 sp.addPath(u, scan.nextInt(), scan.nextInt()); 16 } 17 sp.setPath(0); 18 19 for(int i = 0; i < n; i++) 20 System.out.println(i + " " + sp.getResult(i)); 21 22 scan.close(); 23 System.exit(0); 24 } 25} 26 27class Bheap{ 28 class Elem{ 29 int key; 30 int pt; 31 32 public Elem(int _pt, int _key){ 33 pt = _pt; 34 key = _key; 35 } 36 37 public void set(Elem e){ 38 pt = e.pt; 39 key = e.key; 40 } 41 } 42 43 List<Elem> elem = new ArrayList<Elem>(); 44 45 public Bheap(){ 46 elem.add(new Elem(-1, -1)); 47 } 48 49 public int getTop(){ 50 if(elem.size() <= 1) 51 return -1; 52 int rpt = elem.get(1).pt; 53 54 elem.get(1).set(elem.get(elem.size()-1)); 55 elem.remove(elem.size()-1); 56 57 this.down(1); 58 return rpt; 59 } 60 private void down(int c){ 61 int min = c; 62 if(c * 2 < elem.size() && elem.get(c * 2).key < elem.get(min).key) 63 min = c * 2; 64 if(c * 2 + 1 < elem.size() && elem.get(c * 2 + 1).key < elem.get(min).key) 65 min = c * 2 + 1; 66 if(min == c) 67 return; 68 this.swap(min, c); 69 this.down(min); 70 } 71 private void swap(int c1, int c2){ 72 Elem temp = new Elem(-1, -1); 73 temp.set(elem.get(c1)); 74 elem.get(c1).set(elem.get(c2)); 75 elem.get(c2).set(temp); 76 } 77 78 public void add(int ptr, int cost){ 79 elem.add(new Elem(ptr, cost)); 80 this.up(elem.size()-1); 81 } 82 private void up(int c){ 83 if(c < 2 || elem.get(c).key >= elem.get(c / 2).key) 84 return; 85 86 swap(c, c / 2); 87 this.up(c / 2); 88 } 89} 90 91class SSSPath{ 92 class Next{ 93 int pt; 94 int cost; 95 96 public Next(int to, int c){ 97 pt = to; 98 cost = c; 99 } 100 } 101 102 class Point{ 103 List<Next> next = new ArrayList<Next>(); 104 int reach = -1; 105 boolean fixed = false; 106 } 107 108 Point[] point; 109 Bheap bheap; 110 111 public SSSPath(int n){ 112 point = new Point[n]; 113 for(int i = 0; i < n; i++) 114 point[i] = new Point(); 115 116 bheap = new Bheap(); 117 } 118 119 public void addPath(int from, int to, int c){ 120 point[from].next.add(new Next(to, c)); 121 } 122 123 public void setPath(int from){ 124 point[from].reach = 0; 125 bheap.add(from, 0); 126 setP(); 127 } 128 private void setP(){ 129 int p; 130 while((p = bheap.getTop()) != -1){ 131 if(point[p].fixed) 132 continue; 133 point[p].fixed = true; 134 for(int i = 0; i < point[p].next.size(); i++){ 135 int np = point[p].next.get(i).pt; 136 if(point[np].fixed) 137 continue; 138 int d = point[p].reach + point[p].next.get(i).cost; 139 if(point[np].reach == -1 || point[np].reach > d){ 140 point[np].reach = d; 141 bheap.add(np, d); 142 } 143 } 144 } 145 } 146 147 public int getResult(int i){ 148 return point[i].reach; 149 } 150}

###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yona

2017/04/27 02:58

違うと考える理由を具体的に説明してください。
guest

回答2

0

elem.get(1) でArrayListから取り出した要素(2番目の要素)の値を、.set(elem.get(elem.size()-1)) で変更していますが、その結果をその後のコードで使っていませんから意味がないですね。

ArrayList elemの2番目の要素を最後の要素で置き換えたいのなら、

elem.set(1,elem.get(elem.size()-1))

getTop()という関数名であるのに、elemの最初の要素である elem(0)が使われていないのも不思議です。

質問のコードの出典は何ですか?
何を意図して作られたコードなのですか?
課題を出されて作ってみたが、動かなかったコードとかですか?

そして、質問者は何が知りたいのですか?
私には、質問者の意図が一番の謎です。

投稿2017/04/27 03:29

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gyro16

2017/04/27 03:31

問題の課題の他人のコードを読み解いているところです。
gyro16

2017/04/27 03:36

elem(0)にはpt:-1、key:-1が入っています。
guest

0

ベストアンサー

ElemのリストからElemインスタンスを1つの取り出して、そのElemインスタンスのsetメソッドを呼び出しています。
この時渡している引数はElemのリストから取り出した別のElemインスタンスです。

Java

1elem.get(1).set(elem.get(elem.size()-1));

上記のコードは下記のコードと同等になります。

Java

1[ElemのインスタンスA].set([ElemのインスタンスB]);

投稿2017/04/27 03:16

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gyro16

2017/04/27 03:22

ElemインスタンスBに、ElemインスタンスAを書き換えるでよろしいでしょうか?
yona

2017/04/27 03:28 編集

違いますね。 ElemインスタンスAのptとkeyをElemインスタンスBのptとkeyで書き換えるのでインスタンスの交換ではなく、インスタンスの内容のコピーになるとおもいますよ。
gyro16

2017/04/27 03:32

わかりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問