본문 바로가기

자료구조/SW Expert Academy

1249. 보급로

다익스트라 알고리즘을 적용할 수 있을까를 생각해보자

거리 테이블이 2차원이다.  => Matrix의 각 칸을 노드라고 생각하면 역시 그래프이다. 따라서 다익스트라의 거리테이블 1차원이지만 Matrix에서 거리테이블을 2차원으로 구축해도 괜찮다.

 

 

#include <iostream>
#define INFINITI 987654321

using namespace std;

int const MAX_LEN = 101;



bool U[MAX_LEN][MAX_LEN]{ false, }; // 업데이트 필요여부를 확인하기 위한 배열
int D[MAX_LEN][MAX_LEN]{ 0, };

struct pos {
	int x;
	int y;
};

pos extractMin(int N) {
	pos minPos{ 0 };
	int minVal = INFINITI;
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= N; j++) {
			if (U[i][j] && minVal > D[i][j]) {
				minPos = { i,j };
				minVal = D[i][j];
			}
		}
	}
	return minPos;
}

//right down, left up
int d[4][2]{ {0,1},{-1,0}, {0,-1},{1,0} };

// arr[N] [N]에 도착하면 성공
int findMinPath(int m_arr[MAX_LEN][MAX_LEN], pos start, int N) {
	//다익스트라 사용
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= N; j++) {
			D[i][j] = INFINITI;
		}
	}

	pos cur = start;
	D[start.x][start.y] = 0;
	U[start.x][start.y] = true;

	while (cur.x !=0 || cur.y !=0) {
		cur = extractMin(N);
		if (cur.x == 0 && cur.y == 0) {
			//더이상 없데이트 할게 없습니다.
			return D[N][N];
		}
		U[cur.x][cur.y] = false;

		for (int i = 0; i < 4; i++) {
			int next_x = cur.x + d[i][0];
			if (next_x < 1 || N < next_x) continue;
			int next_y = cur.y + d[i][1];
			if (next_y < 1 || N < next_y) continue;
			if (D[next_x][next_y] > D[cur.x][cur.y] + m_arr[next_x][next_y]) {
				D[next_x][next_y] = D[cur.x][cur.y] + m_arr[next_x][next_y];
				U[next_x][next_y] = true;
			}
		}
	}
	
}

int main() {
	//freopen("Text.txt", "r", stdin);
	int TC;
	scanf("%d",&TC);
	getchar();
	int res_count[10];
	int m_arr[MAX_LEN][MAX_LEN]{ 0, };
	for (int t = 0; t < TC; t++) {
		int N;
		scanf("%d",&N);
		getchar();
		for (int i = 1; i <= N; i++) {
			for (int j = 1; j <= N; j++) {
				m_arr[i][j] = getchar() - '0';
			}
			getchar();
		}

		cout<<"#"<<t+1<<" "<<findMinPath(m_arr, { 1,1 }, N)<<endl;



		//다음 TC를 위한 clean작업
		for (int i = 1; i <= N; i++) {
			for (int j = 1; j <= N; j++) {
				m_arr[i][j] = 0;
			}
		}
	}
	
	return 0;
}

'자료구조 > SW Expert Academy' 카테고리의 다른 글

1263. 사람 네트워크2  (0) 2021.04.13
1251. 하나로  (0) 2021.04.09
1267 - 작업순서  (0) 2021.04.09
2948. 문자열 교집합  (0) 2021.04.08
1232 - 사칙연산  (0) 2021.04.07