Source code for submission s741

fr.cpp

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <vector>
  4. #define mp make_pair
  5. #define pb push_back
  6. #define INF 99999999
  7. #define REP(A,B) for(int (A) = 0; (A) < (B); A++)
  8. using namespace std;
  9.  
  10. vector<pair<int,int> > dest[1111];
  11. pair<int,int> from[1111];
  12. vector<pair<int,int> > desc[1111];
  13. bool visited[1111];
  14.  
  15. void scan(int p) {
  16. visited[p] = true;
  17. for(int i = 0; i < dest[p].size(); i++) {
  18. int v = dest[p][i].first;
  19. if(!visited[v]) {
  20. visited[v] = true;
  21. // desc[p].pbi(mp(v, dest[p][i].second));
  22. from[v] = mp(p, dest[p][i].second);
  23. scan(v);
  24. }
  25. }
  26. }
  27. int dp[1111];
  28. int solve(int p) {
  29. if(desc[p].size() == 0) return INF;
  30. if(dp[p] == -1) {
  31. int ans = 0;
  32. for(int i = 0; i < desc[p].size(); i++) {
  33. int tgt = desc[p][i].first;
  34. int price = desc[p][i].second;
  35. ans += min(price, solve(tgt));
  36. }
  37. dp[p] = ans;
  38. }
  39. return dp[p];
  40. }
  41.  
  42. int main() {
  43. int n, c;
  44. while(scanf("%d %d", &n, &c) == 2) {
  45. REP(i, n) {
  46. dest[i].clear();
  47. desc[i].clear();
  48. }
  49. REP(i, n) visited[i] = false;
  50. memset(dp, -1, sizeof(dp));
  51. REP(i, n-1) {
  52. int u,v,w;
  53. scanf("%d %d %d", &u, &v, &w);
  54. u--; v--;
  55. dest[u].pb(mp(v,w));
  56. dest[v].pb(mp(u,w));
  57. }
  58. c--;
  59. from[c].first = -1;
  60.  
  61. scan(c);
  62. //REP(i, n) if(i != c) printf("from[%d]=%d\n", i, from[i].first);
  63. for(int i = 0; i < n; i++) {
  64. if(i == c) continue;
  65. desc[from[i].first].pb(mp(i, from[i].second));
  66. // printf("descs of %d: %d\n", i+1, desc[i].size());
  67. }
  68. //REP(i, n) printf("descs of %d: %d\n", i+1, desc[i].size());
  69. // REP(i, n) printf("water for %d from %d, closing %d\n", i+1, from[i].first+1, from[i].second);
  70. printf("%d\n", solve(c));
  71. }
  72. return 0;
  73. }
  74.