fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define ll int
  6. #define ull unsigned ll
  7. #define ld long double
  8. typedef vector<int> vi;
  9. typedef multiset<int> mi;
  10. typedef multiset<ll> mll;
  11. typedef vector<ll> vll;
  12. typedef vector<bool> vb;
  13. typedef vector<string> vs;
  14. typedef set<ll> sll;
  15. typedef vector<vector<int>> _2vi;
  16. typedef vector<vector<ll>> _2vll;
  17. #define all(v) ((v).begin()), ((v).end())
  18. #define sz(v) ((ll)((v).size()))
  19.  
  20. #define vinp(v, n) \
  21.   for (ull i = 0; i < (n); i++) \
  22.   cin >> (v)[i]
  23. #define printv(v) \
  24.   for (auto i : (v)) \
  25.   cout << i << " "
  26. #define fr0(i, n) for (ull(i) = 0; (i) < (n); (i)++)
  27. #define fr1(i, n) for (ull(i) = 1; (i) < (n); (i)++)
  28. #define fr(i, x, n) for (ull(i) = (x); (i) < (n); (i)++)
  29. #define _CRT_SECURE_NO_WARNING
  30. const ll MOD = 1000000007;
  31.  
  32. void Bustany() {
  33. ios_base::sync_with_stdio(false);
  34. cin.tie(NULL);
  35. cout.tie(NULL);
  36. #ifndef ONLINE_JUDGE
  37. freopen("./in.txt", "r", stdin), freopen("./out.txt", "w", stdout);
  38. #endif
  39. }
  40.  
  41. const ll N = 2e3 + 10;
  42.  
  43. struct dsu {
  44. int parent[N], group[N];
  45.  
  46. dsu() {
  47. for (int i = 0; i < N; i++) {
  48. parent[i] = i;
  49. group[i] = 1;
  50. }
  51. }
  52.  
  53. int find(int i) {
  54. if (parent[i] == i) {
  55. return i;
  56. }
  57. return parent[i] = find(parent[i]);
  58. }
  59.  
  60. bool samegroup(int x, int y) {
  61. return find(x) == find(y);
  62. }
  63.  
  64. void merge(int x, int y) {
  65. int leader1 = find(x);
  66. int leader2 = find(y);
  67. if (leader1 == leader2) {
  68. return;
  69. }
  70. if (group[leader1] > group[leader2]) {
  71. parent[leader2] = leader1;
  72. group[leader1] += group[leader2];
  73. } else {
  74. parent[leader1] = leader2;
  75. group[leader2] += group[leader1];
  76. }
  77. }
  78.  
  79. int getsize(int x) {
  80. return group[find(x)];
  81. }
  82. };
  83.  
  84. ll dp[520][520];
  85.  
  86.  
  87. void solve() {
  88. ll n, m1, m2;
  89. cin >> n >> m1 >> m2;
  90. map<string, ll> mp;
  91. dsu ds = dsu();
  92. ll i = 1;
  93. for (ll j = 0; j < n; j++) {
  94. string a, b;
  95. cin >> a >> b;
  96. if (mp[a] == 0) {
  97. mp[a] = i;
  98. i++;
  99. }
  100. if (mp[b] == 0) {
  101. mp[b] = i;
  102. i++;
  103. }
  104. ds.merge(mp[a], mp[b]);
  105. }
  106. vll ans;
  107. ll total = 0;
  108. for (ll j = 1; j < i; j++)
  109. if (ds.find(j) == j) {
  110. ans.push_back(ds.getsize(j));
  111. total += ds.getsize(j);
  112. }
  113. memset(dp, 0, sizeof(dp));
  114. //transition
  115. for (auto item: ans) {
  116. for (ll k = m1; k >= 0; k--) {
  117. for (ll j = m2; j >= 0; j--) {
  118. if (k >= item)dp[k][j] = max(dp[k][j], dp[k - item][j] + item);
  119. if (j >= item)dp[k][j] = max(dp[k][j], dp[k][j - item] + item);
  120. }
  121. }
  122. }
  123. cout << total - dp[m1][m2] << endl;
  124. }
  125.  
  126. int main() {
  127. Bustany();
  128. ll t = 1;
  129. freopen("land.in", "r", stdin);
  130. cin >> t;
  131. while (t--) {
  132. solve();
  133. }
  134. }
Success #stdin #stdout 0.01s 5312KB
stdin
Standard input is empty
stdout
0