这片文章讲的思路很清晰。当然,用bfs也是一样可以解决这个问题的。最坑的是每次过不要忘记导游自己也占了一个名额。我就是想了好久都不明白为什么示例的答案是5而不是4,把导游忘了。
http://www.algorithmist.com/index.php/UVa_10099
#include <iostream> #include <sstream> #include <fstream> #include <string> #include <vector> #include <list> #include <queue> #include <map> #include <set> #include <stack> #include <assert.h> #include <algorithm> #include <math.h> #include <ctime> #include <functional> #include <string.h> #include <stdio.h> #include <numeric> #include <float.h> using namespace std; const int MX = 110; int G[MX][MX]; int nodes[MX]; int bfs(int s, int d, int n) { int ans = 0; for (int i = 0; i < n; i++) { if (G[s][i] > 0) { int capability = min(G[s][i], nodes[s]); if (capability > nodes[i]) { nodes[i] = capability; if (i == d) { ans = max(ans, capability); } else { ans = max(ans, bfs(i, d, n)); } } } } return ans; } int main() { int n, r; int q = 0; while (cin >> n >> r) { if (n == 0 && r == 0) break; q++; memset(G, 0, sizeof(G)); memset(nodes, 0, sizeof(nodes)); for (int i = 0; i < r; i++) { int n1, n2, p; cin >> n1 >> n2 >> p; G[n1-1][n2-1] = G[n2-1][n1-1] = p; } int s, d, t; cin >> s >> d >> t; s--; d--; nodes[s] = t; int ans = bfs(s, d, n) - 1; cout << "Scenario #" << q << endl; if (t % ans == 0) ans = t / ans; else ans = t / ans + 1; cout << "Minimum Number of Trips = " << ans << endl; cout << endl; } return 0; }