백준 알고리즘 21278번 : 호석이 두 마리 치킨

Zoo Da·2021년 10월 11일
0

백준 알고리즘

목록 보기
224/337
post-thumbnail

링크

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

sol1) 플로이드

#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
#define X first
#define Y second
#define pb push_back
#define fastio cin.tie(0)->sync_with_stdio(0)
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#define sz(v) (int)(v).size()
#define all(v) v.begin(), v.end()
#define rall(v) (v).rbegin(), (v).rend()
#define compress(v) sort(all(v)), (v).erase(unique(all(v)), (v).end())
#define OOB(x, y) ((x) < 0 || (x) >= n || (y) < 0 || (y) >= m)
#define debug(x) cout << (#x) << ": " << (x) << '\n'
using namespace std;
using ll = long long;
using ull = unsigned long long;
using dbl = double;
using ldb = long double;
using pii = pair<int,int>;
using pll = pair<ll,ll>;
using vi = vector<int>;
using vs = vector<string>;
using tii = tuple<int,int,int>;
template<typename T> using wector = vector<vector<T>>;

const int MOD = 1e9 + 7;
const int INF = 1e9 + 7;
const ll LNF = 1e18 + 7;

wector<int> dist(101,vector<int>(101,INF));

int main() {
	fastio;
  int n,m; cin >> n >> m;
  for(int i = 0; i <= n; i++) dist[i][i] = 0;
  for(int i = 0; i < m; i++){
    int a,b; cin >> a >> b;
    dist[a][b] = 1;
    dist[b][a] = 1;
  }
  // floyd
  for(int k = 1; k <= n; k++){
    for(int i = 1; i <= n; i++){
      for(int j = 1; j <= n; j++){
        dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
      }
    }
  }
  int t1,t2,ans,mn = INF;
  for(int i = 1; i <= n; i++){
    for(int j = i + 1; j <= n; j++){
      int sum = 0;
      for(int k = 1; k <= n; k++){
        sum += min(dist[k][i], dist[k][j]);
      }
      if(mn > sum*2){
        mn = sum*2;
        ans = sum*2;
        t1 = i,t2 = j;
      }
    }
  }
  cout << t1 << ' ' << t2 << ' ' << ans << "\n";
  return 0;
}

플로이드 응용문제(?)였습니다.
플로이드는 정점까지의 거리를 all-to-all로 구해주기 때문에 모든 정점에서 모든 정점까지의 거리를 미리 구해놓고 답을 찾아주면 됩니다.

치킨집을 2개를 열어야하기 때문에 3중 for문을 활용하여 (1,2)~(4,5)까지 각각의 거리를 전부 브루트하게 탐색해주면 됩니다.
답을 출력할때는 "왕복"거리이기 때문에 2를 곱해주어야합니다.

profile
메모장 겸 블로그

0개의 댓글