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

[经验分享] 网络流SAP--模板

[复制链接]

尚未签到

发表于 2015-9-20 10:04:32 | 显示全部楼层 |阅读模式
1 #include<stdio.h>
  2 #include<iostream>
  3 #include<algorithm>
  4 using namespace std;
  5 typedef  struct {int v,next,val;} edge;
  6 const int MAXN=20010;
  7 const int MAXM=500010;
  8 edge e[MAXM];
  9 int p[MAXN],eid;
10 inline void init(){memset(p,-1,sizeof(p));eid=0;}
11 //有向
12 inline void insert1(int from,int to,int val)
13 {
14     e[eid].v=to;
15     e[eid].val=val;
16     e[eid].next=p[from];
17     p[from]=eid++;
18     swap(from,to);
19     e[eid].v=to;
20     e[eid].val=0;
21     e[eid].next=p[from];
22     p[from]=eid++;
23 }
24 //无向
25 inline void insert2(int from,int to,int val)
26 {
27     e[eid].v=to;
28     e[eid].val=val;
29     e[eid].next=p[from];
30     p[from]=eid++;
31     swap(from,to);
32     e[eid].v=to;
33     e[eid].val=val;
34     e[eid].next=p[from];
35     p[from]=eid++;
36 }
37 int n,m;//n为点数 m为边数
38 int h[MAXN];
39 int gap[MAXN];
40 int source,sink;
41 inline int dfs(int pos,int cost)
42 {
43     if (pos==sink)
44     {
45         return cost;
46     }
47     int j,minh=n-1,lv=cost,d;
48     for (j=p[pos];j!=-1;j=e[j].next)
49     {
50         int v=e[j].v,val=e[j].val;
51         if(val>0)
52         {
53             if (h[v]+1==h[pos])
54             {
55                 if (lv<e[j].val) d=lv;
56                 else d=e[j].val;
57                 
58                 d=dfs(v,d);
59                 e[j].val-=d;
60                 e[j^1].val+=d;
61                 lv-=d;
62                 if (h[source]>=n) return cost-lv;
63                 if (lv==0) break;
64             }
65             if (h[v]<minh)    minh=h[v];
66         }
67     }
68     if (lv==cost)
69     {
70         --gap[h[pos]];
71         if (gap[h[pos]]==0) h[source]=n;
72         h[pos]=minh+1;
73         ++gap[h[pos]];
74     }
75     return cost-lv;
76 }
77 int sap(int st,int ed)
78 {
79     source=st;
80     sink=ed;
81     int ret=0;
82     memset(gap,0,sizeof(gap));
83     memset(h,0,sizeof(h));
84     gap[st]=n;
85     while (h[st]<n)
86     {
87         ret+=dfs(st,INT_MAX);
88     }
89     return ret;
90 }
91 int main()
92 {
93     int t,add=1;
94     scanf("%d",&t);
95     while(t--)
96     {
97         printf("Case %d: ",add++);
98         scanf("%d%d",&n,&m);
99         init();
100         int i;
101         int ll,rr,cap;
102         for(i=0;i<m;i++)
103         {
104             scanf("%d%d%d",&ll,&rr,&cap);
105             insert1(ll,rr,cap);
106         }
107         printf("%d\n",sap(1,n));
108     }
109     return 0;
110 }

运维网声明 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-116113-1-1.html 上篇帖子: 什么是SAP(摘自百度百科) 下篇帖子: c# 读取SAP数据
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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