Advertisement
Guest User

H.cc

a guest
Oct 31st, 2014
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.15 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #define MAXN 1001
  4.  
  5. using namespace std;
  6.  
  7. vector<int> adj[MAXN];
  8. bool visit[MAXN];
  9.  
  10. vector<int> paths, cycles;
  11.  
  12. inline int single_path(int d, int n) {
  13.   int den = 2 * d + 1, x = (n - 1) / den;
  14.   return x + (n - 1 - x * den > d);
  15. }
  16.  
  17. int use_root(int dist) {
  18.   int ans = 1, den = 2 * dist + 1;
  19.   for (int x : cycles)
  20.     ans += (x + den - 1) / den - 1;
  21.   for (int x : paths)
  22.     ans += single_path(dist, x);
  23.   return ans;
  24. }
  25.  
  26. int fix_path(int dist, int cid, int pos) {
  27.   int ans = 1;
  28.   for (int i = 0; i < (int)paths.size(); ++i) {
  29.     if (i == cid)
  30.       ans += single_path(dist, paths[i] - pos);
  31.     else
  32.       ans += single_path(dist, paths[i] + pos);
  33.   }
  34.   return ans;
  35. }
  36.  
  37. int max_cycle = 0;
  38. int max_path_id = 0;
  39. int solve(int dist) {
  40.   int ans = use_root(dist);
  41.   if (max_cycle < dist and paths.size()) {
  42.     for (int i = 1; i <= min(dist - max_cycle, paths[max_path_id]-1); ++i)
  43.       ans = min(ans, fix_path(dist, max_path_id, i));
  44.   }
  45.   return ans;
  46. }
  47.  
  48. int root;
  49. void dfs(int u, int d = 1, int p = 0) {
  50.   visit[u] = true;
  51.   bool leaf = true;
  52.   for (int v : adj[u])
  53.     if (v != p) {
  54.       leaf = false;
  55.       if (v == root)
  56.         cycles.push_back(d);
  57.       else if (not visit[v])
  58.         dfs(v, d + 1, u);
  59.     }
  60.   if (leaf)
  61.     paths.push_back(d);
  62. }
  63.  
  64. int main() {
  65.   ios::sync_with_stdio(0);
  66.   int n, m, k;
  67.   cin >> n >> m >> k;
  68.   int u, v;
  69.   while (m--) {
  70.     cin >> u >> v;
  71.     adj[u].push_back(v);
  72.     adj[v].push_back(u);
  73.   }
  74.   root = 1;
  75.   for (u = 1; u <= n; ++u) {
  76.     if (adj[u].size() == 1)
  77.       root = u;
  78.     else if (adj[u].size() > 2) {
  79.       root = u;
  80.       break;
  81.     }
  82.   }
  83.   //cerr << "root: " << root << endl;
  84.   dfs(root);
  85.   for (int x : cycles)
  86.     max_cycle = max(max_cycle, x);
  87.   max_cycle /= 2;
  88.   for (int i = 1; i < (int)paths.size(); ++i)
  89.     if (paths[max_path_id] < paths[i])
  90.       max_path_id = i;
  91.  
  92.   int lo = -1, hi = n, mid;
  93.   while (hi - lo > 1) {
  94.     mid = (hi + lo) >> 1;
  95.     //cerr <<  mid << ' ' << solve(mid) << endl;
  96.     if (solve(mid) > k)
  97.       lo = mid;
  98.     else
  99.       hi = mid;
  100.   }
  101.   cout << hi << endl;
  102.   return 0;
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement