题目链接:http://poj.org/problem?id=2914
思路:模板题,复杂度是n的三次方
#pragma GCC optimize(2)
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <bitset>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <sstream>
#include <iomanip>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll inff = 0x3f3f3f3f3f3f3f3f;
#define FOR(i,a,b) for(int i(a);i<=(b);++i)
#define FOL(i,a,b) for(int i(a);i>=(b);--i)
#define REW(a,b) memset(a,b,sizeof(a))
#define inf int(0x3f3f3f3f)
#define si(a) scanf("%d",&a)
#define sl(a) scanf("%lld",&a)
#define sd(a) scanf("%lf",&a)
#define ss(a) scanf("%s",a)
#define mod ll(1000)
#define pb push_back
#define eps 1e-8
#define lc d<<1
#define rc d<<1|1
#define Pll pair<ll,ll>
#define P pair<int,int>
#define pi acos(-1)
int n,m;
int stoer_wagner(int n,int m)
{
const int N=508;
int G[N][N],visited[N],v[N],w[N],min_cut=inf;
REW(G,0);int x,y,z;
for(int i=0;i<m;i++)
{
if(i<n) v[i]=i;
si(x),si(y),si(z);
//int x=a[i+1].v-1,y=a[i+1].u-1;
G[x][y]+=z;
G[y][x]+=z;
}
while(n>1)
{
int pre=0;
memset(visited,0,sizeof(visited));
memset(w,0,sizeof(w));
for(int i=1;i<n;++i)
{
int k=-1;
for(int j=1;j<n;++j) // 选取V-A中的w(A,x)最大的点x加入集合
{
if(!visited[v[j]])
{
w[v[j]]+=G[v[pre]][v[j]];
if(k==-1||w[v[k]]<w[v[j]]) k = j;
}
}
visited[v[k]] = true; // 标记该点x已经加入A集合
if(i==n-1) // 若|A|=|V|(所有点都加入了A),结束
{
const int s=v[pre],t=v[k]; // 令倒数第二个加入A的点(v[pre])为s,最后一个加入A的点(v[k])为t
min_cut = min(min_cut, w[t]); // 则s-t最小割为w(A,t),用其更新min_cut
for(int j=0;j<n;++j) // Contract(s, t)
{
G[s][v[j]]+=G[v[j]][t];
G[v[j]][s]+=G[v[j]][t];
}
v[k]=v[--n]; // 删除最后一个点(即删除t,也即将t合并到s)
}
// else 继续
pre = k;
}
}
return min_cut;
}
int main()
{
cin.tie(0);
cout.tie(0);
while(cin>>n>>m)
{
//int zz=stoer_wagner(n,m);
cout<<stoer_wagner(n,m)<<endl;
}
return 0;
}