POJ 2914 Minimum Cut 全局最小割

时间:2022-05-05 04:28:00

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

 

#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;
}