Plite
전자오락 공방
Plite
전체 방문자
오늘
어제
  • 분류 전체보기 (274)
    • 프로젝트 (18)
      • 완성 프로젝트 (3)
      • 프로젝트 진행 내역 (15)
    • 공부 및 정리 (241)
      • 백준 코드 (222)
      • C++ (8)
      • DirectX (2)
      • Unreal Engine (6)
      • 프로그래밍 패턴 (3)
    • 기타 (12)
      • 기타 주저리 (10)
    • 게임과 취미 (1)
    • 대문 (1)

블로그 메뉴

  • 홈
  • 프로젝트
  • 취미, 일상
  • 백준 프로필

공지사항

  • [Read Me]
  • 제 블로그에 방문하신 것을 환영합니다.

인기 글

태그

  • 그래프
  • 정수론
  • 브루트포스
  • UC++
  • 이분탐색
  • 스택
  • 세그먼트 트리
  • 투포인터
  • 정렬
  • 위상 정렬
  • SCC
  • LCA
  • 트리
  • KMP
  • 수학
  • 문자열
  • 유니온 파인드
  • 분할정복
  • 기하
  • 동적계획법
  • 백트래킹
  • 우선순위큐
  • 구현
  • 큐
  • 최소 스패닝 트리
  • 트라이
  • C++
  • 백준
  • 조합론
  • 누적합

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Plite

전자오락 공방

[C++]백준 - 11657번 문제
공부 및 정리/백준 코드

[C++]백준 - 11657번 문제

2021. 8. 27. 16:30

11657번: 타임머신 (acmicpc.net)

 

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

 

11657번 : 타임머신


N개의 도시가 있다. 그리고 한 도시에서 출발하여 다른 도시에 도착하는 버스가 M개 있다. 각 버스는 A, B, C로 나타낼 수 있는데, A는 시작도시, B는 도착도시, C는 버스를 타고 이동하는데 걸리는 시간이다. 시간 C가 양수가 아닌 경우가 있다. C = 0인 경우는 순간 이동을 하는 경우, C < 0인 경우는 타임머신으로 시간을 되돌아가는 경우이다.

1번 도시에서 출발해서 나머지 도시로 가는 가장 빠른 시간을 구하는 프로그램을 작성하시오.

 

입력


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

 

 

출력


만약 1번 도시에서 출발해 어떤 도시로 가는 과정에서 시간을 무한히 오래 전으로 되돌릴 수 있다면 첫째 줄에 -1을 출력한다. 그렇지 않다면 N-1개 줄에 걸쳐 각 줄에 1번 도시에서 출발해 2번 도시, 3번 도시, ..., N번 도시로 가는 가장 빠른 시간을 순서대로 출력한다. 만약 해당 도시로 가는 경로가 없다면 대신 -1을 출력한다.

 


 

생각해 볼 점


벨만-포드 알고리즘을 이용합니다.

 

벨만포드 알고리즘은 글이나 그림만으로 이해하기에는 까다롭기 때문에 참고할만한 영상을 첨부합니다.

 

컴퓨터 알고리즘 기초 17강 벨만-포드 알고리즘 | T아카데미 - YouTube

 

 

코드


#include <iostream>
#include <vector>
#include <queue>
using namespace std;

typedef long long ll;

int main() 
{
    int N, M;
    scanf("%d %d", &N, &M);
    
    
    vector<pair<int, ll>> *graph = new vector<pair<int, ll>>[N];  //<목적지, 시간>
    ll *record = new ll[N];
    fill_n(record, N, 20000000000);
    
    //입력부
    for(int i = 0; i < M; i++)
    {
        int A, B, C;
        scanf("%d %d %d", &A, &B, &C);
        A--; B--;
        
        graph[A].push_back({B, C});
    }
    
    //1번 노드에서 시작
    queue<int> q;
    q.push(0);
    record[0] = 0;
    int count = 0;
    
    //밸만포드
    while(!q.empty())
	{
	    vector<int> next_bfs;
	    //무한 순환 시 종료
	    if(count == N) 
	    {
	        printf("-1");
	        delete[] record;
	        delete[] graph;
	        return 0;
	    }
	    
	    while(!q.empty())
	    {
    	    int current = q.front();
    	    q.pop();
    	    
    	    
    	    //경로 진행 시 기존보다 시간이 적게 걸리면 갱신
    	    for(pair<int, ll> next : graph[current])
    	    {
    	        ll next_t = record[current] + next.second;
    	        if(next_t < record[next.first])
    	        {
    	            record[next.first] = next_t;
    	            next_bfs.push_back(next.first);
    	        }
    	    }
	    }
	    
	    for(int i : next_bfs) q.push(i);
	    count++;
	}
	
	//경로가 없으면 -1, 아니면 기존대로 출력
	for(int i = 1; i < N; i++) printf("%lld\n", record[i] == 20000000000 ? -1 : record[i]);
	
	delete[] record;
	delete[] graph;
	
	return 0;
}

 

그 외


 

저작자표시 (새창열림)

'공부 및 정리 > 백준 코드' 카테고리의 다른 글

[C++]백준 - 11404번 문제  (0) 2021.08.28
[C++]백준 - 3273번 문제  (0) 2021.08.27
[C++]백준 - 9370번 문제  (0) 2021.08.25
[C++]백준 - 1504번 문제  (0) 2021.08.25
[C++]백준 - 1655번 문제  (0) 2021.08.25
    '공부 및 정리/백준 코드' 카테고리의 다른 글
    • [C++]백준 - 11404번 문제
    • [C++]백준 - 3273번 문제
    • [C++]백준 - 9370번 문제
    • [C++]백준 - 1504번 문제
    Plite
    Plite
    개발 일지, 게임 이야기 등을 적어두는 공간입니다.

    티스토리툴바