网络流 KM 算法求助
  • 板块学术版
  • 楼主NightTide
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/8 20:09
  • 上次更新2024/10/8 20:15:50
查看原帖
网络流 KM 算法求助
547908
NightTide楼主2024/10/8 20:09
#include<bits/stdc++.h>
#define MAXN 210
#define MAXM 5010
using namespace std;
typedef long long ll;
struct edge{
    int pre, to; ll flow;
};
ll ans;
ll flow[MAXN];
int n, m, s, t, cnt = 1;
int head[MAXN], pre[MAXN];
edge e[MAXM << 1];
bool vis[MAXN];
void add_edge(int u, int v, ll f){
    e[++cnt].pre = head[u];
    e[cnt].to = v; e[cnt].flow = f;
    head[u] = cnt;
}
bool bfs(){
    memset(vis, 0, sizeof(vis));
    queue<int> q; q.push(s);
    vis[s] = true; flow[s] = 0x3f3f3f3f3f3f3f3f;    
    while(!q.empty()){
        int now = q.front(); q.pop();
        for(int i = head[now]; i; i = e[i].pre){
            if(e[i].flow == 0) continue;
            if(vis[e[i].to]) continue;
            flow[e[i].to] = min(flow[now], e[i].flow);
            pre[e[i].to] = i;
            q.push(e[i].to);
            vis[e[i].to] = true;
            if(e[i].to == t) return true;
        }
    }
    return false;
}
void update(){
    int now = t;
    while(now != s){
        e[pre[now]].flow -= flow[t];
        e[pre[now] ^ 1].flow += flow[t];
        now = e[pre[now] ^ 1].to;
    }
    ans += flow[t];
}
int main(){
    scanf("%d%d%d%d",&n,&m,&s,&t);
    for(int i = 1; i <= m; i++){
        int u, v; ll f;
        scanf("%d%d%lld",&u,&v,&f);
        add_edge(u, v, f);
        add_edge(v, u, -f);
    }
    while(bfs()) update();
    printf("%lld\n",ans);
    return 0;
}
2024/10/8 20:09
加载中...