POJ 2139 - Six Degrees of Cowvin Bacon
http://poj.org/problem?id=2139
概要
N 頭の牛に関して,M 本の各映画について,それぞれどの牛が出演したかの情報が与えられる.
同じ映画にある2頭の牛が出演したとき,互いに「1 degree away」であるという. 同じ映画に出演したことはないが,どちらもある別の牛となら同じ映画に出演したことがあるなら,互いに「2 degree away」といい,以降同様に degree を定める.
degree の平均が最も小さい牛に興味がある.その牛の degree の平均値の100倍の値を整数値(切り捨て)で答える.
制約
- 2 <= N <= 300
- 1 <= M <= 10000
- ある牛から別の牛への relationship path は必ず存在する
解法
ワーシャルフロイドするだけ.
poj/2139.cc1 #include <cstdio> 2 #include <vector> 3 #include <limits> 4 using namespace std; 5 6 int main() 7 { 8 int N, M; 9 scanf("%d %d", &N, &M); 10 vector<vector<int> > dist(N, vector<int>(N, 1000000)); 11 for (int i = 0; i < M; i++) { 12 int n; 13 scanf("%d", &n); 14 vector<int> v(n); 15 for (int j = 0; j < n; j++) { 16 scanf("%d", &v[j]); 17 --v[j]; 18 } 19 for (int j = 0; j < n; j++) { 20 for (int k = 0; k < n; k++) { 21 if (j != k) { 22 dist[v[j]][v[k]] = 1; 23 } 24 } 25 } 26 } 27 28 for (int k = 0; k < N; k++) { 29 for (int i = 0; i < N; i++) { 30 for (int j = 0; j < N; j++) { 31 dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]); 32 } 33 } 34 } 35 36 int m = numeric_limits<int>::max(); 37 for (int i = 0; i < N; i++) { 38 int s = 0; 39 for (int j = 0; j < N; j++) { 40 if (i != j) { 41 s += dist[i][j]; 42 } 43 } 44 m = min(m, s); 45 } 46 printf("%d\n", (100*m)/(N-1)); 47 return 0; 48 }