标签:
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3691思路:无向图最小割模板题。 流量最小且汇点自定,则可在最小割T集中任选一点当做汇点。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define debu using namespace std; const int maxn=350; const int INF=0x3f3f3f3f; int e[maxn][maxn]; int vis[maxn],v[maxn],dist[maxn]; int SW(int n) { int i,j; int res=INF; for(int i=0; i<=n; i++) v[i]=i; while(n>1) { int k=2,pre=1; for(i=2; i<=n; i++) { dist[v[i]]=e[v[1]][v[i]]; if(dist[v[i]]>dist[v[k]]) k=i; } memset(vis,0,sizeof(vis)); for(i=2; i<=n; i++) { if(i==n) { res=min(res,dist[v[k]]); for(j=1; j<=n; j++) { e[v[pre]][v[j]]+=e[v[j]][v[k]]; e[v[j]][v[pre]]+=e[v[j]][v[k]]; } v[k]=v[n--]; } vis[v[k]]=1; pre=k; k=-1; for(j=2; j<=n; j++) if(!vis[v[j]]) { dist[v[j]]+=e[v[pre]][v[j]]; if(k==-1||dist[v[k]]<dist[v[j]]) k=j; } } } return res; } int main() { #ifdef debug freopen("in.in","r",stdin); #endif // debug int n,m,a,b,c,st; while(scanf("%d%d%d",&n,&m,&st)==3&&(n+m+st)) { memset(e,0,sizeof(e)); while(m--) { scanf("%d%d%d",&a,&b,&c); e[a][b]+=c,e[b][a]+=c; } int ans=SW(n); printf("%d\n",ans); } return 0; }
标签:
原文地址:http://blog.csdn.net/wang2147483647/article/details/52132502