poj 2914
最小割
代码:
#include<iostream>
#include<fstream>
using namespace std;
int n,m;
int map[501][501];
int v[501],com[501],w[501];
int cost;
int S,T;
void search(){
int i,j,k;
int maxx;
memset(v,0,sizeof(v));
memset(w,0,sizeof(w));
S=T=-1;
while(1)
{
maxx=-1;k=-1;
for(i=0;i<n;i++)
if(!com[i]&&!v[i]&&w[i]>maxx)
{
maxx=w[i];
k=i;
}
if(k==-1) return;
v[k]=1;
cost=w[k];
S=T;T=k;
for(i=0;i<n;i++)
if(!v[i]&&!com[i])
w[i]+=map[k][i];
}
}
void solve(){
int i,j,k;
int ans=100000000;
memset(com,0,sizeof(com));
for(i=1;i<n;i++)
{
search();
if(cost<ans) ans=cost;
com[T]=1;
for(j=0;j<n;j++)
if(!com[j])
{
map[S][j]+=map[T][j];
map[j][S]+=map[j][T];
}
}
cout<<ans<<endl;
}
void read(){
// ifstream cin("in.txt");
int i,j,k,s,t;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(map,0,sizeof(map));
for(i=1;i<=m;i++)
{
// cin>>s>>t>>k;
scanf("%d%d%d",&s,&t,&k);
map[s][t]+=k;
map[t][s]+=k;
}
solve();
}
}
int main(){
read();
return 0;
}
浙公网安备 33010602011771号