POJ 2914 Minimum Cut 全局最小割

本文详细介绍了裸的全局最小割算法的应用,包括如何使用邻接矩阵进行操作及注意事项。通过实例演示了算法的实现过程,对于理解并解决实际问题具有较高的参考价值。

裸的全局最小割了吧 有重边,用邻接矩阵的时候要小心

 

#include<iostream>
#include<cstdio>
#include<bitset>
#include<cstring>
#define MOD 1000000007
#define maxn 509
using namespace std;
int a[590][590],wage[maxn],in[maxn],vis[maxn];
int n,x,y,v;
int find(int& s,int& t)
{
    int max_flow,u=0;
    memset(vis,0,sizeof(vis));
    memset(wage,0,sizeof(wage));
    s=t=-1;
    int uu=n;
    while(uu--)
    {
        int maxx=-0x3f3f3f3f;
        for(int i=1;i<=n;i++)if(!vis[i] && !in[i] && maxx < wage[i])
        maxx = wage[u=i];
        vis[u]=1;
        if(u==t)return max_flow;
        max_flow = maxx;
        s = t; t = u;
        for(int i=1;i<=n;i++)if(!vis[i] && !in[i])wage[i]+=a[u][i];
    }
    return max_flow;
}
int main()
{
    int m,k;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        memset(in,0,sizeof(in));
        memset(a,0,sizeof(a));
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&x,&y,&v);
            x++;y++;
            a[x][y]+=v;
            a[y][x]+=v;
        }
        int s,t,ans = 0x3f3f3f3f;
        for(int i=1;i<n;i++)
        {
            int u = find(s,t);
            in[t]=1;
            ans = min(ans,u);
            for(int j=1;j<=n;j++)if(!in[j] && j !=s)
            {
                a[s][j]+=a[t][j];
                a[j][s]+=a[j][t];
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/philippica/p/4518491.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值