Advertisement
Guest User

Untitled

a guest
Nov 14th, 2019
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.23 KB | None | 0 0
  1. #include <cstdio>
  2. #include <queue>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. struct Edge
  8. {
  9. int to, next, cp;
  10. int org;
  11.  
  12. Edge(){};
  13. Edge(int _to, int _next, int _cp)
  14. {
  15. org = _cp;
  16. to = _to; next = _next; cp = _cp;
  17. }
  18. };
  19.  
  20. const int MAXN = 1e2 + 5;
  21. const int MAXK = 1e4 + 5;
  22.  
  23. int n;
  24. int a[MAXN];
  25. Edge e[MAXK];
  26. int head[MAXN], br;
  27. int source, target;
  28.  
  29. void add_edge(int v, int w, int cp)
  30. {
  31. e[br++] = Edge(w, head[v], cp);
  32. head[v] = br++;
  33. }
  34.  
  35. int sum;
  36.  
  37. void read_input()
  38. {
  39. scanf("%d", &n);
  40. for(int i = 0; i < n; i++)
  41. {
  42. scanf("%d", &a[i]);
  43. }
  44.  
  45. for(int i = 0; i < n + 2; i++)
  46. {
  47. head[i] = -1;
  48. }
  49.  
  50. source = n;
  51. target = n + 1;
  52.  
  53. for(int i = 0; i < n; i++)
  54. {
  55. for(int j = i + 1; j < n; j++)
  56. {
  57. if(a[i] > a[j])
  58. {
  59. sum++;
  60. add_edge(i, j, 1);
  61. add_edge(j, i, 0);
  62. }
  63. }
  64. add_edge(source, i, 1);
  65. add_edge(i, target, 0);
  66. }
  67. }
  68.  
  69. int lvl[MAXN];
  70.  
  71. bool bfs(int v, int w)
  72. {
  73. for(int i = 0; i <= target; i++)
  74. {
  75. lvl[i] = -1;
  76. }
  77.  
  78. queue <int> q;
  79. q.push(v);
  80. lvl[v] = 0;
  81.  
  82. while(!q.empty())
  83. {
  84. int tr = q.front(); q.pop();
  85.  
  86. for(int z = head[tr]; z != -1; z = e[z].next)
  87. {
  88. int to = e[z].to;
  89. int cp = e[z].cp;
  90.  
  91. if(cp > 0 && lvl[to] == -1)
  92. {
  93. lvl[to] = lvl[tr] + 1;
  94. q.push(to);
  95. }
  96. }
  97. }
  98. return lvl[w] != -1;
  99. }
  100.  
  101. int pr[MAXN];
  102.  
  103. int dfs(int v, int flow)
  104. {
  105. if(v == target)
  106. {
  107. return flow;
  108. }
  109. for(int z = pr[v]; z != -1; z = pr[v] = e[z].next)
  110. {
  111. int to = e[z].to;
  112. int cp = e[z].cp;
  113.  
  114. if(cp > 0 && lvl[to] == lvl[v] + 1)
  115. {
  116. int aug_flow = dfs(to, min(flow, cp));
  117. if(aug_flow)
  118. {
  119. e[z].cp -= aug_flow;
  120. e[z ^ 1].cp += aug_flow;
  121. return aug_flow;
  122. }
  123. }
  124. }
  125. return 0;
  126. }
  127.  
  128. int dinic(int fw)
  129. {
  130. for(int i = 0; i < br; i++)
  131. {
  132. e[i].cp = e[i].org;
  133. }
  134. int ans = 0;
  135. while(bfs(source, target))
  136. {
  137. for(int i = 0; i <= target; i++)
  138. {
  139. pr[i] = head[i];
  140. }
  141. int delta = 0;
  142. do
  143. {
  144. delta = dfs(source, fw);
  145. ans += delta;
  146. }while(delta != 0);
  147. }
  148. return ans;
  149. }
  150.  
  151. void solve()
  152. {
  153. double ans = 0;
  154. for(int i = 1; i <= n; i++)
  155. {
  156. ans = max(ans, dinic(i) / n);
  157. }
  158. printf("%.6f\n", ans);
  159. }
  160.  
  161. int main()
  162. {
  163. read_input();
  164. solve();
  165.  
  166. return 0;
  167. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement