您的位置:首页 > 其它

codevs 1028 花店橱窗布置

2017-02-24 18:35 411 查看
网络流二分图匹配
题目描述 Description假设以最美观的方式布置花店的橱窗,有F束花,V个花瓶,我们用美学值(一个整数)表示每束花放入每个花瓶所产生的美学效果。为了取得最佳的美学效果,必须使花的摆放取得最大的美学值。输入描述 Input Description第一行为两个整数F,V(F<=V<=100)接下来F行每行V个整数,第i行第j个数表示第i束花放入第j个花瓶的美学值。输出描述 Output Description一个整数,即最大美学值。样例输入 Sample Input2 210 05 2样例输出 Sample Output12



#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
#define INF 99999999
int n,m,c[250][250],v[250][250],s,t,pre[500];
bool spfa(){
bool vis[205]={0};
int dis[205];
memset(dis,6,sizeof(dis));
queue<int>q;
q.push(s);
vis[s]=1;
dis[s]=0;
int k;
while(!q.empty()){
k=q.front();
q.pop();
vis[k]=0;
for(int i=0;i<=t;i++)
if(v[k][i]&&dis[i]>c[k][i]+dis[k]){
dis[i]=c[k][i]+dis[k];
pre[i]=k;
if(!vis[i]){
q.push(i);
vis[i]=1;
}
}
}
return dis[t]!=dis[204];
}
int maxflow(){
int ans=0;
while(spfa()){
for(int i=t;i!=s;i=pre[i]){
ans+=c[pre[i]][i];
v[pre[i]][i]--;
v[i][pre[i]]++;
}
}
return -ans;
}
int main(){

scanf("%d%d",&n,&m);
s=0;
t=n+m+1;
memset(v,0,sizeof(v));
v[s][s]=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&c[j+n][i]);
c[i][j+n]=-c[j+n][i];
v[i][j+n]++;
c[j+n][t]=0;
v[j+n][t]=1;
}
c[s][i]=0;
v[s][i]=1;
}
cout<<maxflow()<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: