Advertisement
Guest User

Untitled

a guest
May 26th, 2013
306
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <sstream>
  3. #include <fstream>
  4. #include <iomanip>
  5. #include <string>
  6. #include <cstdlib>
  7. #include <cstdio>
  8. #include <cassert>
  9. #include <cstring>
  10. #include <cmath>
  11. #include <ctime>
  12. #include <climits>
  13. #include <vector>
  14. #include <queue>
  15. #include <stack>
  16. #include <set>
  17. #include <bitset>
  18. #include <map>
  19. #include <utility>
  20. #include <algorithm>
  21. #include <numeric>
  22. #include <functional>
  23.  
  24. #define forn(i, n) for (int i = 0; i < int(n); i++)
  25. #define forl(i, n) for (int i = 1; i <= int(n); i++)
  26. #define ford(i, n) for (int i = int(n) - 1; i >= 0; i--)
  27. #define fore(i, l, r) for(int i = int(l); i <= int(r); i++)
  28. #define all(a) (a).begin(), (a).end()
  29. #define sz(a) int((a).size())
  30. #define pb(a) push_back(a)
  31. #define mp(x, y) make_pair((x), (y))
  32. #define ft first
  33. #define sc second
  34. #define x first
  35. #define y second
  36.  
  37. using namespace std;
  38.  
  39. template<typename X> inline X abs(const X& a) { return a < 0 ? -a : a; }
  40. template<typename X> inline X sqr(const X& a) { return a * a; }
  41.  
  42. typedef long long li;
  43. typedef long double ld;
  44. typedef pair<int, int> pt;
  45.  
  46. const int INF = int(1e9);
  47. const li INF64 = li(1e18);
  48. const ld EPS = 1e-9;
  49.  
  50. const int N = 3000 + 3;
  51.  
  52. int n, m, k;
  53. vector<int> g[N];
  54.  
  55. inline bool read()
  56. {
  57.     if (scanf("%d%d%d", &n, &m, &k) != 3) return false;
  58.  
  59.     forn(i, m)
  60.     {
  61.         int x, y;
  62.         assert(scanf("%d%d", &x, &y) == 2);
  63.         x--, y--;
  64.         g[x].pb(y), g[y].pb(x);
  65.     }
  66.  
  67.     return true;
  68. }
  69.  
  70. int ansVal;
  71. int used[N];
  72. int perm[N];
  73.  
  74. int CNT = 200 * 1000 * 1000;
  75.  
  76. void solve(int idx, int curVal)
  77. {
  78.     if (--CNT < 0) return;
  79.     if (curVal > k) return;
  80.     if (curVal >= ansVal) return;
  81.  
  82.     if (idx == n) return void(ansVal = curVal);
  83.  
  84.     int v = perm[idx];
  85.  
  86.     if (used[v]) return solve(idx + 1, curVal);
  87.  
  88.     if (sz(g[v]) <= k)
  89.     {
  90.         int nextVal = curVal;
  91.         forn(j, sz(g[v]))
  92.         {
  93.             nextVal += !used[g[v][j]];
  94.             used[g[v][j]]++;
  95.         }
  96.  
  97.         solve(idx + 1, nextVal);
  98.  
  99.         forn(j, sz(g[v]))
  100.             used[g[v][j]]--;
  101.     }
  102.  
  103.     used[v]++;
  104.     solve(idx + 1, curVal + 1);
  105.     used[v]--;
  106. }
  107.  
  108. inline bool cmp(int i, int j) { return sz(g[i]) > sz(g[j]); }
  109.  
  110. inline void solve()
  111. {
  112.     forn(i, n) perm[i] = i;
  113.     sort(perm, perm + n, cmp);
  114.     //reverse(perm, perm + n);
  115.     //random_shuffle(perm, perm + n);
  116.  
  117.     ansVal = k + 1;
  118.     solve(0, 0);
  119.     if (ansVal == k + 1) puts("Impossible");
  120.     else cout << ansVal << endl;
  121. }
  122.  
  123. int main()
  124. {
  125. #ifdef SU2_PROJ
  126.     assert(freopen("input.txt", "rt", stdin));
  127.     //assert(freopen("output.txt", "wt", stdout));
  128. #endif
  129.  
  130.     assert(read());
  131.     solve();
  132.  
  133.     return 0;
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement