网络流-推送-重贴标签算法

网络流的推送-重贴标签算法代码

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 struct pointtype{
 5     int e;
 6     int h;
 7 }point[1001];
 8 int map[1001][1001];
 9 int c[1001][1001];
10 int n,m,s,t;
11 void init(int x){
12     for(int i=1;i<=n;i++){
13         point[i].h=0;
14         point[i].e=0;
15     }
16     point[s].h=n;
17     for(int i=1;i<=n;i++)
18         if(map[s][i]){
19             c[s][i]=map[s][i];
20             point[i].e+=map[s][i];
21             point[s].e-=map[s][i];
22             map[s][i]-=c[s][i];
23             map[i][s]+=c[s][i];
24         }
25     return;
26 }
27 bool check(){
28     for(int i=1;i<=n;i++)
29         if(point[i].e>0&&i!=t)
30             return true;
31     return false;
32 }
33 bool push(int x)
34 {
35     bool flag=false;
36     for(int i=1;i<=n;i++)
37         if(map[x][i]&&point[x].h==point[i].h+1){
38             int delta=min(point[x].e,map[x][i]);
39             map[x][i]-=delta;
40             map[i][x]+=delta;
41             point[x].e-=delta;
42             point[i].e+=delta;
43             flag=true;
44         }
45     return flag;
46 }
47 void change(int x){
48     int res=INT_MAX;
49     for(int i=1;i<=n;i++)
50         if(map[x][i])
51             res=min(res,point[i].h);
52     if(res==INT_MAX)
53         res-=1;
54     point[x].h=res+1;
55     return;
56 }
57 int main(){
58     cin>>n>>m;
59     for(int i=1;i<=n;i++)
60         for(int j=1;j<=n;j++){
61             map[i][j]=0;
62             c[i][j]=0;
63         }
64     for(int i=1;i<=m;i++){
65         int x,y,z;
66         cin>>x>>y>>z;
67         map[x][y]=z;
68     }
69     cin>>s>>t;
70     init(s);
71     while(check())
72         for(int i=1;i<=n;i++)
73             if(point[i].e>0)
74                 if(!push(i)){
75                     change(i);
76                     point[t].h=0;
77                 }
78     cout<<point[t].e<<endl;
79     return 0;
80 }

 

转载于:https://www.cnblogs.com/shao0099876/p/9336017.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值