Advertisement
Guest User

Untitled

a guest
Jul 23rd, 2014
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.26 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. vector < int > gr[maxn];
  37.  
  38. bool try_kuhn(int v){
  39. if ( used[v] == cc ) return false;
  40. used[v] = cc;
  41. for (int i=0;i<g[v].size();i++){
  42. int to = g[v][i];
  43. if ( vis[to] ) continue;
  44. if ( mt[to] == -1 || try_kuhn(mt[to]) ){
  45. mt[to] = v;
  46. return true;
  47. }
  48. }
  49. return false;
  50. }
  51.  
  52. int match(int x){
  53. memset(mt, -1, sizeof(mt));
  54. memset(used, 0, sizeof(used));
  55. int ans = 0;
  56. cc = 1;
  57. for (int i=0;i<n;i++){
  58. if ( vis[i] ) continue;
  59. cc++;
  60. ans += try_kuhn(i);
  61. }
  62. return x - ans;
  63. }
  64.  
  65. void Solve(){
  66. scanf("%d", &n);
  67. for (int i=0;i<n;i++){
  68. scanf("%d", a + i);
  69. }
  70.  
  71. sort(a, a + n);
  72.  
  73. n = unique(a, a + n) - a;
  74.  
  75. for (int i=0;i<n;i++){
  76. g[i].clear();
  77. for (int j=i+1;j<n;j++){
  78. if ( a[j]%a[i] == 0){
  79. g[i].pb(j);
  80. }
  81. }
  82. }
  83.  
  84. memset(vis, 0, sizeof(vis));
  85. int matching = match(n);
  86. set < int > S;
  87.  
  88. for (int i=0;i<n;i++){
  89. memset(vis, 0, sizeof(vis));
  90.  
  91. for (int j=0;j<n;j++){
  92. if ( a[i]%a[j] == 0 || a[j]%a[i] == 0) vis[j] = true;
  93. }
  94. int t = accumulate(vis, vis + n, 0);
  95.  
  96. if ( match(n-t) == matching-1 ){
  97. S.insert(a[i]);
  98. if ( (int)S.size() == matching )break;
  99. }
  100.  
  101. }
  102.  
  103. forit(it, S){
  104. int x = *it;
  105. cout <<" "<<x;
  106. }
  107. cout <<endl;
  108.  
  109.  
  110. }
  111.  
  112. int main (){
  113. #ifdef LOCAL
  114. freopen ("input.txt", "r", stdin);
  115. freopen ("output.txt", "w", stdout);
  116. #endif
  117.  
  118. int tests;
  119. scanf("%d", &tests);
  120.  
  121. for (int i=0;i<tests;i++){
  122. printf("Case %d:", i + 1);
  123. Solve();
  124. }
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136. return 0;
  137. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement