Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <queue>
- #include <algorithm>
- using namespace std;
- struct Edge
- {
- int to, next, cp;
- int org;
- Edge(){};
- Edge(int _to, int _next, int _cp)
- {
- org = _cp;
- to = _to; next = _next; cp = _cp;
- }
- };
- const int MAXN = 1e2 + 5;
- const int MAXK = 1e4 + 5;
- int n;
- int a[MAXN];
- Edge e[MAXK];
- int head[MAXN], br;
- int source, target;
- void add_edge(int v, int w, int cp)
- {
- e[br++] = Edge(w, head[v], cp);
- head[v] = br++;
- }
- int sum;
- void read_input()
- {
- scanf("%d", &n);
- for(int i = 0; i < n; i++)
- {
- scanf("%d", &a[i]);
- }
- for(int i = 0; i < n + 2; i++)
- {
- head[i] = -1;
- }
- source = n;
- target = n + 1;
- for(int i = 0; i < n; i++)
- {
- for(int j = i + 1; j < n; j++)
- {
- if(a[i] > a[j])
- {
- sum++;
- add_edge(i, j, 1);
- add_edge(j, i, 0);
- }
- }
- add_edge(source, i, 1);
- add_edge(i, target, 0);
- }
- }
- int lvl[MAXN];
- bool bfs(int v, int w)
- {
- for(int i = 0; i <= target; i++)
- {
- lvl[i] = -1;
- }
- queue <int> q;
- q.push(v);
- lvl[v] = 0;
- while(!q.empty())
- {
- int tr = q.front(); q.pop();
- for(int z = head[tr]; z != -1; z = e[z].next)
- {
- int to = e[z].to;
- int cp = e[z].cp;
- if(cp > 0 && lvl[to] == -1)
- {
- lvl[to] = lvl[tr] + 1;
- q.push(to);
- }
- }
- }
- return lvl[w] != -1;
- }
- int pr[MAXN];
- int dfs(int v, int flow)
- {
- if(v == target)
- {
- return flow;
- }
- for(int z = pr[v]; z != -1; z = pr[v] = e[z].next)
- {
- int to = e[z].to;
- int cp = e[z].cp;
- if(cp > 0 && lvl[to] == lvl[v] + 1)
- {
- int aug_flow = dfs(to, min(flow, cp));
- if(aug_flow)
- {
- e[z].cp -= aug_flow;
- e[z ^ 1].cp += aug_flow;
- return aug_flow;
- }
- }
- }
- return 0;
- }
- int dinic(int fw)
- {
- for(int i = 0; i < br; i++)
- {
- e[i].cp = e[i].org;
- }
- int ans = 0;
- while(bfs(source, target))
- {
- for(int i = 0; i <= target; i++)
- {
- pr[i] = head[i];
- }
- int delta = 0;
- do
- {
- delta = dfs(source, fw);
- ans += delta;
- }while(delta != 0);
- }
- return ans;
- }
- void solve()
- {
- double ans = 0;
- for(int i = 1; i <= n; i++)
- {
- ans = max(ans, dinic(i) / n);
- }
- printf("%.6f\n", ans);
- }
- int main()
- {
- read_input();
- solve();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement