【图论:进阶】建模

全局最小割

算法:stoer wagner
学习资料:
上交pdf:读懂步骤
stoer wagner详解:读懂正确性证明
在这里插入图片描述
在这里插入图片描述
然后你就能写出代码了。
上海理工大学第二届“联想杯” Dahno Dahno
无向图最小割模板。

//
// Created by artis on 2021/6/13.
//

#include<bits/stdc++.h>
using namespace std;

const int maxn = 505;

typedef long long ll;

ll a[maxn][maxn];   // 邻接矩阵

const ll inf = 1e18;
int n;
int used[maxn];
ll deg[maxn];

ll stoerWagner(){
    ll res = inf;
    for(int i=1;i<n;++i){
        // repeat n-1 times
        for(int j=1;j<=n;++j) deg[j]=0,used[j]=0;
        used[1]=1;
        for(int j=1;j<=n;++j) deg[j] += a[1][j];
        int s=1,t; // s为上一个
        for(int j=1;j+i<=n;++j){
            // repeat n-i times
            s = t;
            t = 0;
            for(int k=1;k<=n;++k)
                // add tightest connected
                if(!used[k] && deg[k]>deg[t]) t = k;
            used[t]=1;
            for(int k=1;k<=n;++k)
                deg[k] += a[t][k];
        }
        // upd
        res = min(res,deg[t]);
        // 缩点
        if(s>t) swap(s,t);
        for(int j=1;j<=n;++j){
            a[s][j] = a[j][s] += a[t][j];
            a[t][j] = a[j][t] = 0;
        }
        a[s][t] = a[t][s] = 0;
        a[s][s] = a[t][t] = 0;
    }
    return res;
}

int main(){
    scanf("%d",&n);

    ll sum = 0;
    for(int i=1;i<=n;++i){
        for(int j=1;j<=n;++j){
            scanf("%lld",&a[i][j]);
            sum += a[i][j];
        }
    }
    ll cut = stoerWagner();
    printf("%lld\n",sum-2*cut);
}

一般图最大权匹配

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值