본문 바로가기
백준 알고리즘/Graph

백준 16958번 - 텔레포트

by 밍상 2021. 10. 6.

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

 

16958번: 텔레포트

2차원 평면 위에 N개의 도시가 있다. 일부 도시는 특별한 도시이다. (r1, c1)에 있는 도시에서 (r2, c2)에 있는 도시로 가는 이동 시간은 |r1 - r2| + |c1 - c2|와 같다. 만약, 두 도시가 특별한 도시라면, 텔

www.acmicpc.net

 

플로이드-와샬 알고리즘으로 해결 가능한 문제입니다. N이 1000이라 플로이드 알고리즘을 사용하면 시간복잡도가 O(n^3) 이기 때문에 사용하지 못할줄 알았으나 가능했습니다.

 

텔레포트로 이동하는경우와 맨허튼거리계산과 비교해서 작은 값을 먼저 넣어줍니다.

 

그 다음에 플로이드 알고리즘을 사용하면 끝~

#include <iostream>
#include <vector>
#include <math.h>

using namespace std;

int n,t,m;
vector<vector<int>> v;
int graph[1001][1001];
vector<int> answer;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    cin>>n>>t;
    for(int i=0; i<n; i++){
        int s,x,y;
        cin>>s>>x>>y;
        v.push_back({s,x,y});
    }
    for(int i=0; i<n; i++){
        int a = v[i][1];
        int b = v[i][2];
        for(int j=0; j<n; j++){
            int aa = v[j][1];
            int bb = v[j][2];
            graph[i][j]=abs(a-aa)+abs(b-bb);
            if(v[i][0]==1 && v[j][0]==1){
                graph[i][j]=min(graph[i][j],t);
            }
        }
    }

    for(int k=0; k<n; k++){
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                if(i==j)
                    continue;
                if(graph[i][j]>graph[i][k]+graph[k][j])
                    graph[i][j]=graph[i][k]+graph[k][j];
            }
        }
    }
    cin>>m;
    for(int i=0; i<m; i++){
        int a,b;
        cin>>a>>b;
        answer.push_back(graph[a-1][b-1]);
    }
    for(int i=0; i<m; i++)    cout<<answer[i]<<"\n";
    return 0;
}