새소식

반응형
알고리즘/백준 문풀

[C++] 백준 BOJ - 타임머신 (11657)

  • -
728x90
반응형

링크 : https://www.acmicpc.net/problem/11657

 

11657번: 타임머신

첫째 줄에 도시의 개수 N (1 ≤ N ≤ 500), 버스 노선의 개수 M (1 ≤ M ≤ 6,000)이 주어진다. 둘째 줄부터 M개의 줄에는 버스 노선의 정보 A, B, C (1 ≤ A, B ≤ N, -10,000 ≤ C ≤ 10,000)가 주어진다. 

www.acmicpc.net

TIL

1) 풀면서 놓쳤던점

cost 저장용 배열 visited를 long long으로 설정해줘야한다 !

정점간 서로 같은 음수 가중치를 갖는, 서로에 대한 간선이 한개가 아닌 경우를 생각해보쟈 ? 하핫 사실 나두 잘 머름

정답코드

#include<cstdio>
#include<climits>//INT_MAX
long long visited[500 + 1]; //cost 저장용 150억까지 커버할 수 있게끔 (간선 서로 같은 음수 가중치일때..?)
//시작점과 도착점을 연결하는 간선이 하나가 아니고, ~~한 경우가 있을수있으므로.. 이거 캐치가 포인트
int edgeList[3][6000 + 1]; //간선리스트
int N, M, A, B, C;

int main() {
	scanf("%d %d", &N, &M);
	for (int i = 1; i <= M; i++) { //간선리스트에 간선 정보저장
		scanf("%d %d %d", &A, &B, &C);
		edgeList[0][i] = A;
		edgeList[1][i] = B;
		edgeList[2][i] = C;
	}
	visited[1] = 0;
	for (int i = 2; i <= N; i++) {
		visited[i] = INT_MAX;
	}

	for (int i = 1; i <= N - 1; i++) {
		for (int j = 1; j <= M; j++) {
			if (visited[edgeList[0][j]] != INT_MAX) {
				if (visited[edgeList[1][j]] > visited[edgeList[0][j]]+ edgeList[2][j]) {
					visited[edgeList[1][j]] = visited[edgeList[0][j]] + edgeList[2][j];
				}
			}
		}
	}
	
	for (int j = 1; j <= M; j++) {
		if (visited[edgeList[0][j]] != INT_MAX) {
			if (visited[edgeList[1][j]] > visited[edgeList[0][j]] + edgeList[2][j]) {
				visited[edgeList[1][j]] = visited[edgeList[0][j]] + edgeList[2][j];
				printf("-1\n");
				return 0;
			}
		}
	}
	for (int i = 2; i <= N; i++) {
		if (visited[i] == INT_MAX) {
			printf("-1\n");
		}
		else {
			printf("%lld\n", visited[i]);
		}
	}
}
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.