poj2455 Secret Milking Machine

本文介绍了一种结合二分查找与最大流算法解决特定问题的方法。通过具体实例展示了如何初始化图结构、添加边及进行流量分配,并利用二分查找优化最大流算法的效率,最终求解出最小成本。

思路:

二分+最大流。

实现:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <limits.h>
  4 #include <string.h>
  5 #include <assert.h>
  6 #include <queue>
  7 #include <vector>
  8 #include <algorithm>
  9 #include <iostream>
 10 
 11 #define N (398)
 12 #define M (N * N + 4 * N)
 13 const int INF = 0x3f3f3f3f;
 14 typedef long long LL;
 15 
 16 using namespace std;
 17 
 18 struct edge 
 19 {
 20     int v, cap, next;
 21 };
 22 edge e[M];
 23 
 24 int head[N], level[N], cur[N];
 25 int num_of_edges;
 26 
 27 void dinic_init(void) 
 28 {
 29     num_of_edges = 0;
 30     memset(head, -1, sizeof(head));
 31     return;
 32 }
 33 
 34 int add_edge(int u, int v, int c1, int c2) 
 35 {
 36     int& i = num_of_edges;
 37 
 38     assert(c1 >= 0 && c2 >= 0 && c1 + c2 >= 0); // check for possibility of overflow
 39     e[i].v = v;
 40     e[i].cap = c1;
 41     e[i].next = head[u];
 42     head[u] = i++;
 43 
 44     e[i].v = u;
 45     e[i].cap = c2;
 46     e[i].next = head[v];
 47     head[v] = i++;
 48     return i;
 49 }
 50 
 51 int dfs(int u, int t, int bn) 
 52 {
 53     if (u == t) return bn;
 54     int left = bn;
 55     for (int &i = cur[u]; i >= 0; i = e[i].next) 
 56     {
 57         int v = e[i].v;
 58         int c = e[i].cap;
 59         if (c > 0 && level[u] + 1 == level[v]) 
 60         {
 61             int flow = dfs(v, t, min(left, c));
 62             if (flow > 0) 
 63             {
 64                 e[i].cap -= flow;
 65                 e[i ^ 1].cap += flow;
 66                 cur[u] = i;
 67                 left -= flow;
 68                 if (!left) break;
 69             }
 70         }
 71     }
 72     if (left > 0) level[u] = 0;
 73     return bn - left;
 74 }
 75 
 76 bool bfs(int s, int t) 
 77 {
 78     memset(level, 0, sizeof(level));
 79     level[s] = 1;
 80     queue<int> q;
 81     q.push(s);
 82     while (!q.empty()) 
 83     {
 84         int u = q.front();
 85         q.pop();
 86         if (u == t) return true;
 87         for (int i = head[u]; i >= 0; i = e[i].next) 
 88         {
 89             int v = e[i].v;
 90             if (!level[v] && e[i].cap > 0) 
 91             {
 92                 level[v] = level[u] + 1;
 93                 q.push(v);
 94             }
 95         }
 96     }
 97     return false;
 98 }
 99 
100 LL dinic(int s, int t) 
101 {
102     LL max_flow = 0;
103 
104     while (bfs(s, t)) 
105     {
106         memcpy(cur, head, sizeof(head));
107         max_flow += dfs(s, t, INT_MAX);
108     }
109     return max_flow;
110 }
111 
112 int n, p, t;
113 struct Edge
114 {
115     int a, b, cost;
116 };
117 Edge es[40005];
118 
119 bool check(int x)
120 {
121     dinic_init();
122     for (int i = 0; i < p; i++)
123     {
124         if (es[i].cost <= x)
125         {
126             add_edge(es[i].a, es[i].b, 1, 0);
127             add_edge(es[i].b, es[i].a, 1, 0);            
128         }
129     }
130     return dinic(1, n) >= t;
131 }
132 
133 int main()
134 {
135     scanf("%d %d %d", &n, &p, &t);
136     int maxn = 0;
137     for (int i = 0; i < p; i++)
138     {
139         scanf("%d %d %d", &es[i].a, &es[i].b, &es[i].cost);
140         maxn = max(maxn, es[i].cost);
141     }
142     int l = 0, r = maxn, ans = INF;
143     while (l <= r)
144     {
145         int m = (l + r) >> 1;
146         if (check(m))
147         {
148             r = m - 1; ans = m;
149         }
150         else l = m + 1;
151     }
152     printf("%d\n", ans);
153     return 0;
154 }

 

转载于:https://www.cnblogs.com/wangyiming/p/8280059.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值