这题说是模板题,用stoer算法可以过,关于这个算法,网上很多雷同的讲解,自己就没必要再贴一份了(搞不清谁是原著)
贴一个模板吧(提交是8000多ms,看牛人将可以达到500多ms,求牛人指点啊)
#include<cstdio>
#include<iostream>
#include<cstring>
#define INF 1000000000
using namespace std;
const int N=505;
int graph[N][N];
int rec[N],v[N],w[N];
int S,T,cost,n;
inline void prim()
{
memset(w,0,sizeof(w));
memset(v,0,sizeof(v));
S=T=-1;
int i,k,Max;
while(1){
Max=-INF,k=-1;
for(i=0;i<n;i++){
if(!rec[i]&&!v[i]&&w[i]>Max){
Max=w[i];
k=i;
}
}
if(k==-1) return;
v[k]=1;
cost=Max;
S=T,T=k;
for(i=0;i<n;i++){
if(!rec[i]&&!v[i]){
w[i]+=graph[k][i];
}
}
}
}
int stoer()
{
memset(rec,0,sizeof(rec));
int mincut=INF;
for(int i=0;i<n-1;i++){
prim();
rec[T]=1;
if(cost<mincut) mincut=cost;
if(mincut==0) return 0;
for(int j=0;j<n;j++){
if(!rec[j]){
graph[S][j]+=graph[T][j];
graph[j][S]+=graph[j][T];
}
}
}
return mincut;
}
int main(){
int s,t,k,m;
while(scanf("%d %d",&n,&m)!=EOF){
memset(graph,0,sizeof(graph));
while(m--){
scanf("%d %d %d",&s,&t,&k);
graph[s][t]+=k;
graph[t][s]+=k;
}
printf("%d\n",stoer());
}
return 0;
}