题意:
给出一个无向又重边的图,又重边的边权累加起来,求最小割。
分析:
模板 全局最小割算法题
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=505;
const int inf=0x3f3f3f3f;
int dis[maxn];
int node[maxn];
int vis[maxn];
int g[maxn][maxn];
int sto_wag(int n){
int maxj,pre,m,ans=inf;
for(int i=0;i<n;i++) node[i]=i;
while(n>1){
m=-1,maxj=1;
for(int i=1;i<n;i++){
dis[node[i]]=g[node[0]][node[i]];
vis[node[i]]=0;
if(dis[node[i]]>m){
m=dis[node[i]];
maxj=i;
}
}
pre=0;
vis[node[0]]=1;
for(int j=1;j<n;j++){
vis[node[maxj]]=1;
if(j==n-1){
ans=min(ans,m);
for(int i=0;i<n;i++){
g[node[pre]][node[i]]+=g[node[maxj]][node[i]];
g[node[i]][node[pre]]+=g[node[maxj]][node[i]];
}
node[maxj]=node[--n];
}else{
pre=maxj;
m=-1;
for(int i=1;i<n;i++){
if(!vis[node[i]]){
dis[node[i]]+=g[node[pre]][node[i]];
if(dis[node[i]]>m){
m=dis[node[i]];
maxj=i;
}
}
}
}
}
}
return ans;
}
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]+=w;g[v][u]+=w;
}
printf("%d\n",sto_wag(n));
}
}