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

[经验分享] hdu 4280 最大流sap

[复制链接]

尚未签到

发表于 2015-9-20 10:36:03 | 显示全部楼层 |阅读模式
  模板套起来

1  
5 7  //5个结点,7个边
3 3  //坐标
3 0  
3 1
0 0
4 5
1 3 3  //相连的结点和流
2 3 4
2 4 3
1 5 6
4 5 3
1 4 4
3 4 2
9


  1 #include<cstdio>
  2 #include<algorithm>
  3 #include<cstring>
  4 using namespace std;
  5 const int MAXN = 100010;//点数的最大值
  6 const int MAXM = 400010;//边数的最大值
  7 const int INF = 0x3f3f3f3f;
  8 int n;
  9 struct Edge
10 {
11     int to,next,cap,flow;
12 }edge[MAXM];//注意是MAXM
13 int tol;
14 int head[MAXN];
15 int gap[MAXN],dep[MAXN],cur[MAXN];
16 void init()
17 {
18     tol = 0;
19     memset(head,-1,sizeof(head));
20 }
21 void addedge(int u,int v,int w,int rw = 0)
22 {
23     edge[tol].to = v; edge[tol].cap = w; edge[tol].flow = 0;
24     edge[tol].next = head; head = tol++;
25     edge[tol].to = u; edge[tol].cap = rw; edge[tol].flow = 0;
26     edge[tol].next = head[v]; head[v] = tol++;
27 }
28 int Q[MAXN];
29 void BFS(int start,int end)
30 {
31     memset(dep,-1,sizeof(dep));
32     memset(gap,0,sizeof(gap));
33     gap[0] = 1;
34     int front = 0, rear = 0;
35     dep[end] = 0;
36     Q[rear++] = end;
37     while(front != rear)
38     {
39         int u = Q[front++];
40         for(int i = head; i != -1; i = edge.next)
41         {
42             int v = edge.to;
43             if(dep[v] != -1)continue;
44             Q[rear++] = v;
45             dep[v] = dep + 1;
46             gap[dep[v]]++;
47         }
48     }
49 }
50 int S[MAXN];
51 int SAP(int start,int end,int N)
52 {
53     BFS(start,end);
54     memcpy(cur,head,sizeof(head));
55     int top = 0;
56     int u = start;
57     int ans = 0;
58     while(dep[start] < N)
59     {
60         if(u == end)
61         {
62             int Min = INF;
63             int inser;
64             for(int i = 0;i < top;i++)
65             if(Min > edge[S].cap - edge[S].flow)
66             {
67                 Min = edge[S].cap - edge[S].flow;
68                 inser = i;
69             }
70             for(int i = 0;i < top;i++)
71             {
72                 edge[S].flow += Min;
73                 edge[S^1].flow -= Min;
74             }
75             ans += Min;
76             top = inser;
77             u = edge[S[top]^1].to;
78             continue;
79         }
80         bool flag = false;
81         int v;
82         for(int i = cur; i != -1; i = edge.next)
83         {
84             v = edge.to;
85             if(edge.cap - edge.flow && dep[v]+1 == dep)
86             {
87                 flag = true;
88                 cur = i;
89                 break;
90             }
91         }
92         if(flag)
93         {
94             S[top++] = cur;
95             u = v;
96             continue;
97         }
98         int Min = N;
99         for(int i = head; i != -1; i = edge.next)
100         if(edge.cap - edge.flow && dep[edge.to] < Min)
101         {
102             Min = dep[edge.to];
103             cur = i;
104         }
105         gap[dep]--;
106         if(!gap[dep])return ans;
107         dep = Min + 1;
108         gap[dep]++;
109         if(u != start)u = edge[S[--top]^1].to;
110         }
111     return ans;
112 }
113 int main()
114 {
115     #ifndef ONLINE_JUDGE
116     freopen("1.in","r",stdin);
117     #endif
118     int start,end;
119     int m;
120     int u,v,z;
121     int T;
122     scanf("%d",&T);
123     while(T--)
124     {
125         init();
126         scanf("%d%d",&n,&m);
127         int minx=10000000;
128         int maxx=-10000000;
129         int x,y;
130         for(int i=1;i<=n;i++)
131         {
132             scanf("%d%d",&x,&y);
133             if(minx>x)
134             {
135                 minx=x;
136                 start=i;
137             }
138             if(maxx<x)
139             {
140                 maxx=x;
141                 end=i;
142             }
143         }
144         while(m--)
145         {
146             scanf("%d%d%d",&u,&v,&z);
147             addedge(u,v,z);
148             addedge(v,u,z);
149         }
150         int ans=SAP(start,end,n);
151         printf("%d\n",ans);
152     }
153     return 0;
154 }
  

运维网声明 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-116139-1-1.html 上篇帖子: 长期内推SAP职位 下篇帖子: Changing the Title of SAP Transaction
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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