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

[经验分享] HDU 4280 Island Transport 又一发SAP

[复制链接]

尚未签到

发表于 2015-9-17 13:14:59 | 显示全部楼层 |阅读模式
  终于有点SAP的感觉了。总结下模板



#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=100008;
const int INF=0x7f7f7f7f;
struct fuck{
int u,v,w,cap,next;
}edge[maxn<<2];
int head[maxn];
int tol;
void init()
{
tol=0;
memset(head,-1,sizeof(head));
}
void addedge(int u,int v,int w)
{
edge[tol].u=u;
edge[tol].v=v;
edge[tol].cap=w;
edge[tol].next=head;
head=tol++;
edge[tol].u=v;
edge[tol].v=u;
edge[tol].cap=0;
edge[tol].next=head[v];
head[v]=tol++;
}
bool vis[maxn];
int dep[maxn],gap[maxn];
//  bfs反向构造层次图,那么只关注反向残量为0的边
void bfs(int sour,int sink)
{
queue<int>  q;
memset(vis,false,sizeof(vis));
memset(dep,-1,sizeof(dep));
memset(gap,0,sizeof(gap));
q.push(sink);
dep[sink]=0;gap[0]=1;vis[sink]=true;
int u,v,i;
while(!q.empty())
{
u=q.front();q.pop();
for(i=head;i!=-1;i=edge.next)
{
v=edge.v;
if(!vis[v]&&edge.cap==0)
{
vis[v]=true;
dep[v]=dep+1;
q.push(v);
gap[dep[v]]++;
}
}
}
}
int cur[maxn],S[maxn];
int last;
// 分三个过程
int sap(int sour,int sink)
{
bfs(sour,sink);
int i,u;
for(i=0;i<=last;i++)
cur=head;//当前狐
int top=0,max_flow=0;
u=sour;
/*三个步骤。1从当前狐查找可行狐(残量大于0,层次差为1)
2 若没有找到可行狐,寻找当前节点的所有相邻点,找最小的dep修改当前点层次
退回到上一个点继续查找
3 若找到汇点,在路径中找到一条残量最小的边,以这个残量修改整个路径
然后从这条边的起点继续查找*/
while(dep[sour]<last)//起点层次等于所有弧长说明没有***了
    {
if(u==sink)
{
int temp=INF,inser;
for(i=0;i<top;i++)
{
if(edge[S].cap<temp)
{
temp=edge[S].cap;
inser=i;
}
}
for(i=0;i<top;i++)
{
edge[S].cap-=temp;
edge[S^1].cap+=temp;
}
max_flow+=temp;
top=inser;
u=edge[S[top]].u;
}
if(u!=sink&&gap[dep-1]==0)   break;//简直,出现断层即退出
for(i=cur;i!=-1;i=edge.next)
if(edge.cap>0&&dep==dep[edge.v]+1)
break;
if(i!=-1)
{
cur=i;
S[top++]=i;
u=edge.v;
}
else
{
int mi=last;
for(i=head;i!=-1;i=edge.next)
{
if(edge.cap==0)  continue;
if(mi>dep[edge.v])
{
mi=dep[edge.v];
cur=i;
}
}
--gap[dep];
dep=mi+1;
++gap[dep];
if(u!=sour)     u=edge[S[--top]].u;
}
}
return max_flow;
}
int main()
{
int i,j,n,m,u,v,w,t,x,y;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
init();
int sour,sink;
int mi=1e9,ma=-1e9;
for(i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
if(x<mi)
{
mi=x;
sour=i;
}
if(x>ma)
{
ma=x;
sink=i;
}
}
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
addedge(v,u,w);
}
last=n;
printf("%d\n",sap(sour,sink));
}
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-114989-1-1.html 上篇帖子: SAP屏幕设计器专题:日期与时间(五) 下篇帖子: SAP R/3 财务基本概念及集成性浅释 —— 主数据篇
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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