设为首页 收藏本站
查看: 855|回复: 0

[经验分享] POJ 1273 第一个SAP(ISAP)

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-9-19 10:34:11 | 显示全部楼层 |阅读模式
  /* sap学了很长时间,一直不敢下手写,结果就是不写永远不会真正的理解算法的含义,sap理论很多算法书上都有讲解,但我还是建议看数学专业 图论的书,比如 《有向图的理论,算法及应用》,这本书的内容非常棒,相信看过的都知道吧,比其他算法书上讲的透多了。
SAP有个优化就是 当出现断链时,就可以直接退出,还有个优化是当前弧的优化,这两个优化只需要一句话+一个数组就解决了,相当实惠,好的ISAP执行的效率真的非常高,我写的ISAP用的是链式前向星法表示。
这个就算是模板了吧,虽然写的不是很好。。*/
  



#include<iostream>
#include<cstdio>
#include<memory.h>
#include<cmath>
using namespace std;
#define MAXN 500
#define MAXE 40000
#define INF 0x7fffffff
long ne,nv,tmp,s,t,index;
struct Edge{
long next,pair;
long v,cap,flow;
}edge[MAXE];
long net[MAXN];
long ISAP()
{
long numb[MAXN],dist[MAXN],curedge[MAXN],pre[MAXN];
long cur_flow,max_flow,u,tmp,neck,i;
memset(dist,0,sizeof(dist));
memset(numb,0,sizeof(numb));
memset(pre,-1,sizeof(pre));
for(i = 1 ; i <= nv ; ++i)
curedge = net;
numb[nv] = nv;
max_flow = 0;
u = s;
while(dist < nv)
{
/* first , check if has augmemt flow */
if(u == t)
{
cur_flow = INF;
for(i = s; i != t;i = edge[curedge].v)
{  
if(cur_flow > edge[curedge].cap)
{
neck = i;
cur_flow = edge[curedge].cap;
}
}
for(i = s; i != t; i = edge[curedge].v)
{
tmp = curedge;
edge[tmp].cap -= cur_flow;
edge[tmp].flow += cur_flow;
tmp = edge[tmp].pair;
edge[tmp].cap += cur_flow;
edge[tmp].flow -= cur_flow;
}
max_flow += cur_flow;
u = neck;
}
/* if .... else ... */
for(i = curedge; i != -1; i = edge.next)
if(edge.cap > 0 && dist == dist[edge.v]+1)
break;
if(i != -1)
{
curedge = i;
pre[edge.v] = u;
u = edge.v;
}else{
if(0 == --numb[dist]) break;
curedge = net;
for(tmp = nv,i = net; i != -1; i = edge.next)
if(edge.cap > 0)
tmp = tmp<dist[edge.v]?tmp:dist[edge.v];
dist = tmp + 1;
++numb[dist];
if(u != s) u = pre;
}
}
return max_flow;
}
int main() {
long i,j,np,nc,m,n;
long a,b,val;
long g[MAXN][MAXN];
while(scanf("%d%d",&ne,&nv)!=EOF)
{
s = 1;
t = nv;
memset(g,0,sizeof(g));
memset(net,-1,sizeof(net));
for(i=0;i<ne;++i)
{
scanf("%ld%ld%ld",&a,&b,&val);
g[a] += val;
}
for(i=1;i<=nv;++i)
for(j = i; j <= nv;++j)
if(g[j]||g[j])
{
edge[index].next = net;
edge[index].v = j;
edge[index].cap = g[j];
edge[index].flow = 0;
edge[index].pair = index+1;
net = index++;
edge[index].next = net[j];
edge[index].v = i;
edge[index].cap = g[j];
edge[index].flow = 0;
edge[index].pair = index-1;
net[j] = index++;
}
printf("%ld\n",ISAP());
}
return 0;
}

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-115720-1-1.html 上篇帖子: sap 几个名词 下篇帖子: SAP Migo增强 105时通过提货单号自动带出批次和生产日期
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表