您的位置:首页 > 其它

HDU 3691

2014-07-21 20:29 267 查看
一个源点,一个汇点,明显是网络流的问题,但据说用网络流来求最小割,会超时。。囧,那出题的人是怎么想的。。。

用SW的算法来求最小割。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int MAXN=310;
const int inf=100000000;
int vis[MAXN],combine[MAXN],wan[MAXN];
int map[MAXN][MAXN];
int n,m,t;
int mincut,S,T;

void seacut(){
int Max; int p;
S=T=-1;
memset(vis,0,sizeof(vis));
memset(wan,0,sizeof(wan));
for(int i=0;i<n;i++){
Max=-inf;
for(int j=0;j<n;j++){
if(!combine[j]&&!vis[j]&&wan[j]>Max){
Max=wan[j]; p=j;
}
}
if(p==T) return;
S=T;T=p;
vis[T]=1;
for(int j=0;j<n;j++){
if(!combine[j]&&!vis[j]){
wan[j]+=map[T][j];
}
}
}
}

void storewanger(){
mincut=inf;
memset(combine,0,sizeof(combine));
for(int i=0;i<n-1;i++){
seacut();
if(wan[T]<mincut) mincut=wan[T];
if(mincut==0) return;
combine[T]=1;
for(int j=0;j<n;j++){
if(!combine[j]){
map[S][j]+=map[T][j];
map[j][S]+=map[j][T];
}
}
}
}

int main(){
int u,v,w;
while(scanf("%d%d%d",&n,&m,&t)!=EOF){
if(!n&&!m&&!t) break;
memset(map,0,sizeof(map));
for(int i=0;i<m;i++){
scanf("%d%d%d",&u,&v,&w);
u--; v--;
map[u][v]+=w;
map[v][u]+=w;
}
storewanger();
printf("%d\n",mincut);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: