ROUTING 문제 질문입니다~ kijowo0201 라우팅 문제를 풀고 있습니다. 다익스트라 알고리즘으로 풀고 있는데요. 예제 입출력은 잘 나옵니다. 그러나 제출하면 아래와 같이 RTE (nonzero return code) 라고 뜨는데요, 원인을 모르겠습니다. 혹시 Main 이외의 클래스를 선언해서 쓰면 안되는건가요?;; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.Scanner; public class Main { static int x; static int y; static double val; static int size = 0; static double sol = 0.0; public static void main(String[] args) throws FileNotFoundException { long start = System.currentTimeMillis(); int cases = 0; int lineCnt = 0; Scanner in = new Scanner(System.in); //Scanner in = new Scanner(new File("./src/routing_dijkstra_opti_1/input.txt")); cases = in.nextInt(); for(int caseNum=0; caseNum<cases; caseNum++) { sol = 0.0; size = 0; size = in.nextInt(); lineCnt = in.nextInt(); //arr = new double[size][size]; Map<Integer, Map<Integer, Double>> arr = new HashMap<Integer, Map<Integer, Double>>(); for(int i=0; i<lineCnt; i++) { x = in.nextInt(); //x에서 y = in.nextInt(); //y로 가는 비용 val = in.nextDouble(); if(!arr.containsKey(x)) arr.put(x, new HashMap<Integer, Double>()); arr.get(x).put(y, val); } //입력 잘되었는지 테스트 // for(int i=0; i // for(int j=0; j // System.out.print(arr[i][j] + "\t"); // } // System.out.println(); // } ///////////////////////////////////////////////////////////////////////////////////////////////////////// //여기부터 알고리즘 시작. //거리를 저장할 배열을 선언 ArrayList Q = new ArrayList(); ArrayList Q2 = new ArrayList(); //초기 거리 세팅 Q.add(new Node(0, 1.0, 0)); for(int i=1; i<size; i++) { Q.add(new Node(i,-1.0,0)); } //size 만큼 뺄거니까 size 만큼 for 문 돌리자. double selectCost; double beforeCost; double lineCost; double newCost; int end = size-1; for(int i=0; i<size; i++) { //로직 시작 //원본을 백업떠둔다. 정렬하여 선택되지 않은 노드들 중 선택할 노드를 찾기 위하여 Q2 = (ArrayList<Node>) Q.clone(); Node select = getMin(Q2);//before 중에 있는 것 중에 거리가 가장 작은것을 선택한다. int n = select.n; //선택한 노드번호 if(n == end) { sol = select.dist; break; } Q.get(n).selected = true; selectCost = select.dist; //선택한 노드까지 오는 코스트 //System.out.println(selectCost); for(int j=0; j<size; j++) { //lineCost = arr[n][j]; //선택한 노드에서 j노드로 가는 비용 Map<Integer, Double> temp = null; if(!arr.containsKey(n)) { continue; } temp = arr.get(n); if(!temp.containsKey(j)) { continue; } lineCost = temp.get(j); if(lineCost == 0) continue; newCost = selectCost * lineCost; beforeCost = Q.get(j).dist; if( newCost < beforeCost || beforeCost == -1.0 ) { //원래 거리보다 작거나 원래거리가 무한대이면 //j번째 노드에 새cost를 넣어줌. Q.remove(j); Q.add(j, new Node(j, newCost, n)); } } } System.out.println(String.format("%.10f", sol)); }//한 케이스 종료 long end = System.currentTimeMillis(); //System.out.println("실행시간 : " + (end-start) + "ms"); }//메인함수 종료 private static Node getMin(ArrayList<Node> q) { // TODO Auto-generated method stub Collections.sort(q, new Comparator<Node>() { @Override public int compare(Node o1, Node o2) { // TODO Auto-generated method stub double x = o1.dist; double y = o2.dist; if(o1.selected == true) return 1; if(o2.selected == true) return -1; if(x == -1.0) { return 1; } if(y == -1.0) { return -1; } if(x-y < 0.0) { return -1; } return 1; } }); return q.get(0); } } class Node { int n; double dist; boolean selected = false; public Node(int n, double dist, int way) { super(); this.n = n; this.dist = dist; } } 8년 전
1개의 댓글이 있습니다. gwange Main 내부에 선언해서 사용하시면 어떨까요? 8년 전 link 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.
kijowo0201
라우팅 문제를 풀고 있습니다.
다익스트라 알고리즘으로 풀고 있는데요.
예제 입출력은 잘 나옵니다.
그러나 제출하면 아래와 같이
RTE (nonzero return code)
라고 뜨는데요, 원인을 모르겠습니다.
혹시 Main 이외의 클래스를 선언해서 쓰면 안되는건가요?;;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
// for(int i=0; i
// for(int j=0; j
// System.out.print(arr[i][j] + "\t"); Q = new ArrayList(); Q2 = new ArrayList();
// }
// System.out.println();
// }
/////////////////////////////////////////////////////////////////////////////////////////////////////////
//여기부터 알고리즘 시작.
//거리를 저장할 배열을 선언
ArrayList
ArrayList
//초기 거리 세팅
Q.add(new Node(0, 1.0, 0));
for(int i=1; i<size; i++) {
Q.add(new Node(i,-1.0,0));
}
}
class Node {
int n;
double dist;
boolean selected = false;
}
8년 전