Advertisement
Guest User

Untitled

a guest
Dec 18th, 2014
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.94 KB | None | 0 0
  1. #include <string>
  2. #include <cmath>
  3. #include <fstream>
  4. #include <iostream>
  5. #include <sstream>
  6. #include <list>
  7. #include <algorithm>
  8. #include <set>
  9. #include <map>
  10. #include <stack>
  11. #include <queue>
  12. #include <numeric>
  13. #include <bitset>
  14. #include <deque>
  15. //#include <random>
  16. #include <string.h>
  17. #include <stdlib.h>
  18. #include <vector>
  19. #include <unordered_map>
  20. #include <thread>
  21.  
  22. const long long LINF = (5e18);
  23. const int INF = (1<<30);
  24. const int sINF = (1<<23);
  25. const int MOD = 1000000009;
  26. const double EPS = 1e-6;
  27.  
  28. using namespace std;
  29.  
  30. class Ethernet {
  31.  
  32. public:
  33.  
  34. vector<int> dist;
  35. vector<vector<int> > g, dp;
  36. int maxDist;
  37.  
  38. int f(int x, int maxDepth) {
  39. if (dp[x][maxDepth] != -1)
  40. return dp[x][maxDepth];
  41. int res = 1;
  42. for (int y: g[x])
  43. res += f(y, maxDist);
  44. for (int y: g[x]) {
  45. for (int m=dist[y-1]; m <= maxDepth; ++m) {
  46. int r = min(maxDist - m, m);
  47. int tem = f(y, m - dist[y-1]);
  48. for (int z: g[x]) {
  49. if (y == z)
  50. continue;
  51. int cut = f(z, maxDist);
  52. if (dist[z-1] > r) {
  53. tem += cut;
  54. } else {
  55. int with = f(z, r - dist[z-1]) - 1;
  56. tem += min(cut, with);
  57. }
  58. }
  59. res = min(res, tem);
  60. }
  61. }
  62. return dp[x][maxDepth] = res;
  63. }
  64.  
  65. int connect(vector <int> parent, vector <int> dist, int maxDist) {
  66. int N = (int)parent.size() + 1;
  67. this->dist = dist;
  68. this->maxDist = maxDist;
  69. dp.clear();
  70. dp.resize(N+1, vector<int>(maxDist+1, -1));
  71. g.clear();
  72. g.resize(N);
  73. for (int i=1; i<N; ++i)
  74. g[parent[i-1]].push_back(i);
  75. return f(0, maxDist);
  76. }
  77.  
  78.  
  79. // BEGIN CUT HERE
  80. public:
  81. void run_test(int Case) { if ((Case == -1) || (Case == 0)) test_case_0(); if ((Case == -1) || (Case == 1)) test_case_1(); if ((Case == -1) || (Case == 2)) test_case_2(); if ((Case == -1) || (Case == 3)) test_case_3(); if ((Case == -1) || (Case == 4)) test_case_4(); }
  82. private:
  83. template <typename T> string print_array(const vector<T> &V) { ostringstream os; os << "{ "; for (typename vector<T>::const_iterator iter = V.begin(); iter != V.end(); ++iter) os << '\"' << *iter << "\","; os << " }"; return os.str(); }
  84. void verify_case(int Case, const int &Expected, const int &Received) { cerr << "Test Case #" << Case << "..."; if (Expected == Received) cerr << "PASSED" << endl; else { cerr << "FAILED" << endl; cerr << "\tExpected: \"" << Expected << '\"' << endl; cerr << "\tReceived: \"" << Received << '\"' << endl; } }
  85. void test_case_0() { int Arr0[] = {0,0,0}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arr1[] = {1,1,1}; vector <int> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); int Arg2 = 2; int Arg3 = 1; verify_case(0, Arg3, connect(Arg0, Arg1, Arg2)); }
  86. void test_case_1() { int Arr0[] = {0,0,0,0,0,0,0}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arr1[] = {1,2,3,4,5,6,7}; vector <int> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); int Arg2 = 8; int Arg3 = 4; verify_case(1, Arg3, connect(Arg0, Arg1, Arg2)); }
  87. void test_case_2() { int Arr0[] = {0,1,2,3,4,5}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arr1[] = {1,2,3,4,5,6}; vector <int> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); int Arg2 = 6; int Arg3 = 3; verify_case(2, Arg3, connect(Arg0, Arg1, Arg2)); }
  88. void test_case_3() { int Arr0[] = {0,0,0,1,1}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arr1[] = {1,1,1,1,1}; vector <int> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); int Arg2 = 2; int Arg3 = 2; verify_case(3, Arg3, connect(Arg0, Arg1, Arg2)); }
  89. void test_case_4() { int Arr0[] = {0,1,0,3,0,5,0,6,0,6,0,6,4,6,9,4,5,5,2,5,2}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arr1[] = {93,42,104,105,59,73,161,130,30,81,62,93,131,133,139,5,13,34,25,111,4}; vector <int> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); int Arg2 = 162; int Arg3 = 11; verify_case(4, Arg3, connect(Arg0, Arg1, Arg2)); }
  90.  
  91. // END CUT HERE
  92.  
  93.  
  94. };
  95.  
  96.  
  97.  
  98. // BEGIN CUT HERE
  99.  
  100. int main() {
  101.  
  102. Ethernet ___test;
  103.  
  104. ___test.run_test(-1);
  105.  
  106. }
  107.  
  108. // END CUT HERE
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement