기록하지 않았다면 잃어버릴 시간들
Home
  • 분류 전체보기 (184)
    • Lang (6)
      • c++ (2)
      • Java (2)
      • python (2)
    • 프레임워크 (18)
      • Spring (16)
      • JPA (2)
    • 알고리즘 (141)
      • 이론 (4)
      • 백준 (59)
      • Codility (13)
      • 프로그래머스 (65)
    • CS (4)
      • 운영체제 (0)
      • 자료구조 (0)
      • DB (4)
      • 네트워크 (0)
      • 보안 (0)
    • 기타 (7)
    • 프로젝트 (4)
      • 게시판 만들기로 배우는 Spring Data JP.. (4)
Home
  • 분류 전체보기 (184)
    • Lang (6)
      • c++ (2)
      • Java (2)
      • python (2)
    • 프레임워크 (18)
      • Spring (16)
      • JPA (2)
    • 알고리즘 (141)
      • 이론 (4)
      • 백준 (59)
      • Codility (13)
      • 프로그래머스 (65)
    • CS (4)
      • 운영체제 (0)
      • 자료구조 (0)
      • DB (4)
      • 네트워크 (0)
      • 보안 (0)
    • 기타 (7)
    • 프로젝트 (4)
      • 게시판 만들기로 배우는 Spring Data JP.. (4)
블로그 내 검색

기록하지 않았다면 잃어버릴 시간들

새로운 것을 배우는게 즐거운 개발자입니다.

  • 알고리즘/백준

    BOJ_1753 / C++

    2021. 8. 4.

    by. 내이름은 킹햄찌

    https://www.acmicpc.net/problem/1753

     

    1753번: 최단경로

    첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1≤V≤20,000, 1≤E≤300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1≤K≤V)가 주어진다.

    www.acmicpc.net

    백준 온라인저지 1753번 문제입니다. 

    다익스트라

    #include<iostream>
    #include<vector>
    #include<queue>
    #define MAX 20001
    #define INF 987654321
    #define endl "\n"
    using namespace std;
    
    int node[MAX];
    vector<pair<int, int>> connect[MAX];
    int V, E, K;
    
    void init(int a)
    {
    	for (int i = 1; i <= a; i++)
    	{
    		node[i] = INF;
    	}
    }
    void Input() {
    	int u, v,w;
    	cin >> V >> E >> K;
    	init(V);
    	while (E--)
    	{
    		cin >> u >> v >> w;
    		connect[u].push_back(make_pair(v, w));
    	}
    }
    
    void dijkstra(int a)
    {
    	node[a] = 0;
    	priority_queue<pair<int, int>> q;
    	q.push(make_pair(0, a));
    	while (!q.empty())
    	{
    		int dist = -1*q.top().first;
    		int current = q.top().second;
    		q.pop();
    
    		if (node[current] < dist) continue;
    
    		for (int i = 0; i < connect[current].size(); i++)
    		{
    			int next = connect[current][i].first;
    			int next_dist = dist + connect[current][i].second;
    
    			if (next_dist < node[next])
    			{
    				node[next] = next_dist;
    				q.push(make_pair(-1 * next_dist, next ));
    			}
    		}
    	}
    }
    
    int main(void) {
    	Input();
    	dijkstra(K);
    	for (int i = 1; i <= V; i++)
    	{
    		if (node[i] == INF)
    		{
    			cout << "INF" << endl;
    		}
    		else
    		{
    			cout << node[i] << endl;
    		}
    	}
    }

    방향 그래프를 제시받아서 시작점으로 부터 모든 정점까지의 거리를 출력하는 문제입니다.

    다익스트라 알고리즘으로 출발점으로 부터 모든 간선까지의 거리 그래프를 만들고 차례대로 출력했습니다.

    우선 큐에 다음 조사 노드를 넣을때 -부호를 붙이는 이유는 priority_queue의 defult는 내림차순인 것을 이용해서 가중치가 거리가 작은 노드순으로 정렬 목적입니다.

     

    문제해결중 만난 어려움

    다음 노드에 대한 조사를 하기위해 우선 큐에 넣게 되는데 (다음 노드, 가중치) 순서로 큐에 넣어서 시간초과를 받았고,

    (가중치, 다음노드) 순으로 큐에 넣어 가까운 거리순 조사할 수 있도록 수정해서 정답처리 받았습니다. 

    '알고리즘 > 백준' 카테고리의 다른 글

    BOJ1516/ C++  (0) 2022.01.03
    BOJ_16234 / C++  (0) 2021.12.24
    BOJ_14502 / C++  (0) 2021.10.03
    BOJ_1182 / C++  (0) 2021.10.03
    BOJ_1916 / C++  (0) 2021.08.04

    댓글

    관련글

    • BOJ_16234 / C++ 2021.12.24
    • BOJ_14502 / C++ 2021.10.03
    • BOJ_1182 / C++ 2021.10.03
    • BOJ_1916 / C++ 2021.08.04
    맨 위로
전체 글 보기
Tistory 로그인
Tistory 로그아웃
로그아웃 글쓰기 관리

Today

Total

Powered by ⓒ Kakao Corp.

Designed by Nana
블로그 이미지
내이름은 킹햄찌

티스토리툴바