无向带权图最小割stoer-wagner算法(poj 2914 Minimum cut)

来源:互联网 发布:商业地产it 编辑:程序博客网 时间:2024/05/21 11:04

这题其实就是知道stoer wagner 算法就能解决不知道就不行.

stoer wagner 算法

这个算法基于减治的思想. 设 G(V,E),{M,N} 组成 G 的最小割,对于任意两点s,t无非两种情况

  • s,tMs,tN mincutcut(s,t)
  • sM,tNmincut=cut(s,t)

详细过程见论文
《store-wagner》
这里写图片描述

code

#include <cstdio>#include <iostream>#include <vector>#include <queue>#include <algorithm>#include <cmath>#include <cstring>#include <map>#include <set>#include <stack>#define fi first#define se second#define INF 0x3f3f3f3f#define INF64 0x3f3f3f3f3f3f3f3fusing namespace std;typedef long long LL;typedef pair<int,int> Pair;const int maxn = 5000+10;const int MAX_V = 500+10;int G[MAX_V][MAX_V];int w[MAX_V];//权重int vis[MAX_V];int v[MAX_V];//顶点int stoer_wagner(int n){  int min_cut = INF;  for(int i=0 ; i<n ;++i)v[i] = i;//初始化  while (n>1) {    memset(vis,0,sizeof(vis));    memset(w,0,sizeof(w));    int s = 0;    for(int i=1 ; i<n ; ++i)    {      int t = -1;//A外权值最大点      for(int j= 1 ; j<n ; ++j)        if(!vis[v[j]]){          w[v[j]]+=G[v[s]][v[j]];//与A相连接的顶点的权重          if(t == -1 || w[v[t]]<w[v[j]])t = j;        }      vis[v[t]] = 1;      if(i == n-1){//合并s,t更新权值        min_cut = min(min_cut,w[v[t]]);        for(int j=0 ; j<n ; ++j)          G[v[j]][v[s]] = G[v[s]][v[j]] = G[v[s]][v[j]]+G[v[j]][v[t]];        v[t] = v[--n];      }else s = t;    }  }  return min_cut;}int main() {  int n,m;  while (scanf("%d%d",&n,&m )!=EOF) {    memset(G,0,sizeof(G));    while (m--) {      int u,v,w;      scanf("%d%d%d",&u,&v,&w );      G[u][v] = G[v][u] =G[u][v] +  w;    }    printf("%d\n",stoer_wagner(n));  }  return 0;}

复杂度为O(|V|3)

0 0
原创粉丝点击