Advertisement
Guest User

Untitled

a guest
Jul 23rd, 2014
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.19 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <string>
  6. #include <cmath>
  7. #include <algorithm>
  8. #include <ctime>
  9. #include <vector>
  10. #include <queue>
  11. #include <stack>
  12. #include <map>
  13. #include <set>
  14. #include <functional>
  15. #include <numeric>
  16.  
  17. #define f first
  18. #define s second
  19. #define ll long long
  20. #define mp make_pair
  21. #define pb push_back
  22. #define pii pair < int, int >
  23. #define pll pair < long long, long long >
  24. #define forit(it,S) for(typeof(S.begin()) it = S.begin(); it!= S.end(); it++)
  25.  
  26. using namespace std;
  27. int const maxn = (int)2e2 + 111;
  28. int const inf = (1<<30) - 1;
  29.  
  30. int n;
  31. int a[maxn];
  32. int cc;
  33. int used[maxn], mt[maxn];
  34. bool vis[maxn];
  35. vector < int > g[maxn];
  36.  
  37. bool try_kuhn(int v){
  38. if ( used[v] == cc ) return false;
  39. used[v] = cc;
  40. for (int i=0;i<g[v].size();i++){
  41. int to = g[v][i];
  42. if ( vis[to] ) continue;
  43. if ( mt[to] == -1 || try_kuhn(mt[to]) ){
  44. mt[to] = v;
  45. return true;
  46. }
  47. }
  48. return false;
  49. }
  50.  
  51. int match(int x){
  52. memset(mt, -1, sizeof(mt));
  53. memset(used, 0, sizeof(used));
  54. int ans = 0;
  55. cc = 1;
  56. for (int i=0;i<n;i++){
  57. if ( vis[i] ) continue;
  58. cc++;
  59. ans += try_kuhn(i);
  60. }
  61. return x - ans;
  62. }
  63.  
  64. void Solve(){
  65. scanf("%d", &n);
  66. for (int i=0;i<n;i++){
  67. scanf("%d", a + i);
  68. }
  69.  
  70. sort(a, a + n);
  71. for (int i=0;i<n;i++){
  72. g[i].clear();
  73. for (int j=i+1;j<n;j++){
  74. if ( a[j]%a[i] == 0){
  75. g[i].pb(j);
  76. }
  77. }
  78. }
  79.  
  80. memset(vis, 0, sizeof(vis));
  81. int matching = match(n);
  82. set < int > S;
  83.  
  84. for (int i=0;i<n;i++){
  85. memset(vis, 0, sizeof(vis));
  86. for (int j=0;j<g[i].size();j++){
  87. int to = g[i][j];
  88. vis[to] = true;
  89. }
  90. vis[i] = true;
  91. if ( match(n-1-(int)g[i].size()) == matching-1 ){
  92. S.insert(a[i]);
  93. if ( (int)S.size() == matching )break;
  94. }
  95.  
  96. }
  97.  
  98. forit(it, S){
  99. int x = *it;
  100. cout <<x<<" ";
  101. }
  102. cout <<endl;
  103.  
  104.  
  105. }
  106.  
  107. int main (){
  108. #ifdef LOCAL
  109. freopen ("input.txt", "r", stdin);
  110. freopen ("output.txt", "w", stdout);
  111. #endif
  112.  
  113. int tests;
  114. scanf("%d", &tests);
  115.  
  116. for (int i=0;i<tests;i++){
  117. printf("Case %d: ", i + 1);
  118. Solve();
  119. }
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131. return 0;
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement