题目大意:给出一个无向图,两点之间可能有多条边,求将图割成两部分的最小花费。
Stoer_Wagner算法目前还不太理解当作模板记录一下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MX = 505;
const int inf = 0x3f3f3f3f;
struct Stoer_Wagner
{
int mp[MX][MX],s,t;
int v[MX],d[MX];
void init(int n)
{
memset(mp,0,sizeof(mp));
}
void add(int u,int v,int w)
{
mp[u][v]+=w;
mp[v][u]+=w;
}
int solve(int n)
{
int i, j, now, ret=inf;
for(i=0; i<n; i++)v[i]=i;
while(n>1)
{
for(now=0, i=1; i<n; i++) d[v[i]]=0;
for(i=1; i<n; i++)
{
swap(v[now],v[i-1]);
for(now=j=i; j<n ; j++)
{
d[v[j]] += mp[v[i-1]][v[j]];
if(d[v[now]]<d[v[j]]) now = j;
}
}
if(ret > d[v[now]])
{
ret = d[v[now]];
s = v[now-1];
t = v[now];
}
for(j = 0; j<n; j++)
mp[v[j]][v[now-1]] = mp[v[now-1]][v[j]]+=mp[v[j]][v[now]];
v[now]=v[--n];
}
return ret;
}
} F;
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
F.init(n);
for(int i=1; i<=m; i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
F.add(u,v,w);
}
printf("%d\n",F.solve(n));
}
}