codevs 1028 花店橱窗布置

来源:互联网 发布:2017网络使用人数 编辑:程序博客网 时间:2024/04/28 09:49
网络流二分图匹配
题目描述 Description

假设以最美观的方式布置花店的橱窗,有F束花,V个花瓶,我们用美学值(一个整数)表示每束花放入每个花瓶所产生的美学效果。为了取得最佳的美学效果,必须使花的摆放取得最大的美学值。

输入描述 Input Description

第一行为两个整数F,V(F<=V<=100)

接下来F行每行V个整数,第i行第j个数表示第i束花放入第j个花瓶的美学值。

输出描述 Output Description

一个整数,即最大美学值。

样例输入 Sample Input

2 2

10 0

5 2

样例输出 Sample Output

12

#include<cstdio>#include<cstring>#include<iostream>#include<queue>using namespace std;#define INF 99999999int 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;}

0 0
原创粉丝点击