본문 바로가기

백준

백준1240 - 노드사이의 거리

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

 

1240번: 노드사이의 거리

N(2≤N≤1,000)개의 노드로 이루어진 트리가 주어지고 M(M≤1,000)개의 두 노드 쌍을 입력받을 때 두 노드 사이의 거리를 출력하라.

www.acmicpc.net

노드와 간선에 관한 비용 문제였다. 문제에서 트리는 노드들이 서로 양방향으로 연결되어 있고 최대 1000개의 노드를 가진다. 따라서 1001개의 벡터를 선언하고 1001 X 1001개의 서로 다른 노드를 연결 하였을 때 드는 비용을 저장하였다. 노드의 대한 정보를 입력 받은 후에 bfs를 이용하여 내가 출발한 노드에서 도착한 노드까지의 비용을 출력하면 된다.

#include <iostream>
#include <queue>
#include <vector>
#define MAX 1001
using namespace std;

class Point {
public:
     int t, cost;
     Point(int t, int cost) {
        this->t =  t;
        this->cost= cost;
     }
};

int N, M;
int x, y, z;
int a, b;
int mat[MAX][MAX];
vector<int> v[MAX];

void bfs() {
    bool visit[MAX] = { false, };
    queue<Point> q;
    q.push(Point(a, 0));
    visit[a] = true;
    
    while(!q.empty()) {
        int t = q.front().t;
        int cost = q.front().cost;
        q.pop();
        
        if(t == b) {
            cout << cost << '\n';
            break;
        }
        
        for(unsigned int i = 0; i < v[t].size(); i++) {
            if(!visit[v[t][i]]) {
                q.push(Point(v[t][i], cost + mat[t][v[t][i]]));
                visit[v[t][i]] = true;
            }
        }
    }
}

int main() {
    cin >> N >> M;
    for(int i = 0; i < N - 1; i++) {
        cin >> x >> y >> z;
        v[x].push_back(y);
        v[y].push_back(x);
        mat[x][y] = z;
        mat[y][x] = z;
    }
    
    for(int j = 0; j < M; j++) {
        cin >> a >> b;
        bfs();
    }
}

'백준' 카테고리의 다른 글

백준16162 - 가희와 3단 고음  (0) 2020.05.13
백준18353 - 병사 배치하기  (0) 2020.05.12
백준11607 - Grid  (0) 2020.05.01
백준9753 - 짝 곱  (0) 2020.04.21
백준14430 - 자원 캐기  (0) 2020.04.19