아래는 수정한 코드. 런타임 에러가 없어진 것으로 메모리 제한에는 걸리지 않지만 시간초과가 됨.

일단 C로 고쳐서 짜 보고 C에서도 시간초과가 뜨면 조금 더 수정해서 필요없는 계산을 날려야 할 듯.

한 단계를 거칠 때 모든 루트를 다 고려하는 것이 아니라 한 번에 한 루트의 최단거리를 계산하는 방향으로 잡게 될 듯.

아래는 약간 수정한 코드.



import java.util.Scanner;

public class Main {	
	public int[][] shortestRouteMtx(int[][] input){
		int n=input.length;
		int[][] route0=new int[n][n];
		int[][] route1=new int[n][n];
		boolean parity=true;
		route0=input;
		for(int i=0;i<n;i++) {
			route1=new int[n][n];
			parity=true;
			for(int j=0;j<n;j++) {
				for(int k=0;k<n;k++) {
					if(j==k) {
						route1[j][k]=0;
					}
					else {
						for(int l=0;l<n;l++) {
							if(route1[j][k]==0) {
								if((j==l || l==k) || (route0[j][l]!=0 && route0[l][k]!=0)) {
									route1[j][k]=route0[j][l]+route0[l][k];
								}
							}
							else if((j==l || l==k) || (route0[j][l]!=0 && route0[l][k]!=0) && route1[j][k]>route0[j][l]+route0[l][k]){
								route1[j][k]=route0[j][l]+route0[l][k];
							}
						}
					}
					if(parity && route0[j][k]!=route1[j][k]) {
						parity=false;
					}
				}
			}
			if(parity) {
				break;
			}
		}
		return route0;
	}

	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		Main main=new Main();
		int N=sc.nextInt(), m=sc.nextInt();
		int[][] route=new int[N][N];
		for(int i=0;i<m;i++) {
			int a=sc.nextInt(), b=sc.nextInt(), c=sc.nextInt();
			route[a-1][b-1]=c;
			route[b-1][a-1]=c;
		}
		int mid1=sc.nextInt(), mid2=sc.nextInt();
		route=main.shortestRouteMtx(route);

		int startToMid1=route[0][mid1-1];
		int mid1ToMid2=route[mid1-1][mid2-1];
		int mid2ToEnd=route[mid2-1][N-1];
		int startToMid2=route[0][mid2-1];
		int mid2ToMid1=route[mid2-1][mid1-1];
		int mid1ToEnd=route[mid1-1][N-1];
		if(startToMid1*mid1ToMid2*mid2ToEnd==0) {
			if(startToMid2*mid2ToMid1*mid1ToEnd==0) {
				System.out.println(-1);
			}
			else {
				System.out.println(startToMid2+mid2ToMid1+mid1ToEnd);
			}
		}
		else if(startToMid2*mid2ToMid1*mid1ToEnd==0) {
			System.out.println(startToMid1+mid1ToMid2+mid2ToEnd);
		}
		else if(startToMid1+mid1ToMid2+mid2ToEnd<startToMid2+mid2ToMid1+mid1ToEnd) {
			System.out.println(startToMid1+mid1ToMid2+mid2ToEnd);
		}
		else {
			System.out.println(startToMid2+mid2ToMid1+mid1ToEnd);
		}
	}
}

'Exercises > 길찾기' 카테고리의 다른 글

백준 1504  (0) 2019.01.30
백준 1504  (1) 2018.05.06
1504 cpp  (0) 2018.05.05
백준 1504 수정  (0) 2018.05.05
백준 문제 1504  (0) 2018.05.03

+ Recent posts