// UVa 11792 - Krochanska is Here! #include <iostream> #include <string.h> using namespace std; int main() { int cases; for (cin >> cases; cases; cases--) { int n, s; int count[10001]; int m = 1; int imp[10001]; int idx[101]; memset(imp, 0, sizeof(imp)); memset(count, 0, sizeof(count)); int train[100][10001]; // input and figure out important stations cin >> n >> s; for (int i = 0; i < s; i++) { int j = 0; cin >> train[i][j]; while (train[i][j] != 0) { count[train[i][j]]++; if (count[train[i][j]] == 2) { imp[train[i][j]] = m; idx[m] = train[i][j]; m++; } j++; cin >> train[i][j]; } } unsigned long long int lnk[101][101]; memset(lnk, 255, sizeof(lnk)); unsigned long long int path[101][101]; memset(path, 255, sizeof(path)); unsigned long long int oo = path[0][0]; // construct graph with only important stations for (int i = 0; i < s; i++) { int j = 0; while (train[i][j] != 0) { int a = imp[train[i][j]]; if (a) { for (int k = 0; k <= j; k++) { int b = imp[train[i][k]]; if (b) { if (j - k < lnk[a][b]) { lnk[a][b] = j - k; lnk[b][a] = j - k; path[a][b] = j - k; path[b][a] = j - k; } } } } j++; } } // all-to-all shortest paths for (int k = 1; k < m; k++) for (int i = 1; i < m; i++) for (int j = 1; j < m; j++) if (path[i][j] > path[i][k] + path[k][j]) path[i][j] = path[i][k] + path[k][j]; unsigned long long int sol = oo; int ss; // where is Krochanska? for (int i = 1; i < m; i++) { unsigned long long int sum = 0; for (int j = 1; j < m; j++) { sum += path[i][j]; } if (sum < sol || (sum == sol && idx[i] < ss)) { sol = sum; ss = idx[i]; } } // output cout << "Krochanska is in: " << ss << endl; } return 0; }
Monday, May 16, 2016
UVa 11792 - Krochanska is Here!
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment