// UVa 10296 - Jogging Trails #include <iostream> #include <string.h> using namespace std; int n, m, oo; int lnk[16][16], dist[16][16], T[65536]; void floyd() { for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) dist[i][j] = lnk[i][j]; for (int k = 1; k <= n; k++) for (int i = 1; i <= n; i++) if (dist[i][k] != oo) for (int j = 1; j <= n; j++) if (dist[i][j] > dist[i][k] + dist[k][j]) dist[i][j] = dist[i][k] + dist[k][j]; } int dp(int mask) { if (T[mask] == oo) { int partial = oo; for (int i = 1; i <= n; i++) if (mask & (1 << i)) { for (int j = 1; j <= n; j++) if (j != i && (mask & (1 << j))) { int new_mask = ((mask ^ (1 << i)) ^ (1 << j)); int sub = dp(new_mask); if (sub + dist[j][i] < partial) partial = sub + dist[j][i]; } } T[mask] = partial; } return T[mask]; } int main() { while ((cin >> n) && n) { cin >> m; int total_sum = 0; memset(lnk, 127, sizeof(lnk)); oo = lnk[0][0]; int cnt[16]; memset(cnt, 0, sizeof(cnt)); // input for (int j = 0; j < m; j++) { int a, b, c; cin >> a >> b >> c; total_sum += c; if (lnk[a][b] > c) { lnk[a][b] = c; lnk[b][a] = c; } cnt[a]++; cnt[b]++; } // prepare floyd(); int start = 0; for (int i = 1; i <= n; i++) if (cnt[i] & 1) start = start | (1 << i); // DP memset(T, 127, sizeof(T)); T[0] = 0; cout << total_sum + dp(start) << endl; } return 0; }
Tuesday, June 30, 2015
UVa 10296 - Jogging Trails
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment