poj 2914&&hdu 3002 全局最小割Stoer-Wagner算法模板

本文介绍了一个基于图论的最小割算法实现,通过寻找图中连接两个特定顶点的最大流量来确定最小割。该算法首先定义了必要的数据结构,并详细解释了关键函数seach和mincut的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>
#include<string.h>
#include<iostream>
#define inf 0x3fffffff
#define N 510
int  n,ma[N][N],combine[N];
int seach(int &s,int &t) {
  int vis[N],i,j,tm,maxx,w[N];
  memset(vis,0,sizeof(vis));
  memset(w,0,sizeof(w));
  tm=10000;
  for(i=0;i<n;i++) {
      maxx=-inf;
    for(j=0;j<n;j++)
        if(!vis[j]&&!combine[j]&&maxx<w[j]) {//找到最大值
            maxx=w[j];
            tm=j;
        }
        if(t==tm) {return w[t];}//最后t和tm相等
        vis[tm]=1;
        s=t;t=tm;
        for(j=0;j<n;j++)//
        if(!vis[j]&&!combine[j])
            w[j]+=ma[t][j];
  }
  return w[t];
}
int mincut() {
int   mi=inf,ans,i,s,t,j;
memset(combine,0,sizeof(combine));
for(i=0;i<n-1;i++) {//只需要找n-1次
    s=-1;t=-1;
    ans=seach(s,t);//找到t和t的前一个点s
    combine[t]=1;//移除
    if(ans<mi)mi=ans;
    for(j=0;j<n;j++) {//将t合并到s点
        ma[s][j]+=ma[t][j];
        ma[j][s]+=ma[j][t];
    }
}
return mi;
}
int main() {
     int m,i,j,k;
     while(scanf("%d%d",&n,&m)!=EOF) {
        memset(ma,0,sizeof(ma));
        while(m--) {
            scanf("%d%d%d",&i,&j,&k);
            ma[i][j]+=k;ma[j][i]+=k;
        }
        printf("%d\n",mincut());
     }
return 0;
}

转载于:https://www.cnblogs.com/thefirstfeeling/p/4410751.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值