HDU4292 网络流 2012 ACM/ICPC Asia Regional Chengdu Online1005

简介:

                                   Food

                                         Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
                                                            Total Submission(s): 555 Accepted Submission(s): 247
         

Problem Description
  You, a part-time dining service worker in your college’s dining hall, are now confused with a new problem: serve as many people as possible.
  The issue comes up as people in your college are more and more difficult to serve with meal: They eat only some certain kinds of food and drink, and with requirement unsatisfied, go away directly.
  You have prepared F (1 <= F <= 200) kinds of food and D (1 <= D <= 200) kinds of drink. Each kind of food or drink has certain amount, that is, how many people could this food or drink serve. Besides, You know there’re N (1 <= N <= 200) people and you too can tell people’s personal preference for food and drink.
  Back to your goal: to serve as many people as possible. So you must decide a plan where some people are served while requirements of the rest of them are unmet. You should notice that, when one’s requirement is unmet, he/she would just go away, refusing any service.

Input
  There are several test cases.
  For each test case, the first line contains three numbers: N,F,D, denoting the number of people, food, and drink.
  The second line contains F integers, the ith number of which denotes amount of representative food.
  The third line contains D integers, the ith number of which denotes amount of representative drink.
  Following is N line, each consisting of a string of length F. e jth character in the ith one of these lines denotes whether people i would accept food j. “Y” for yes and “N” for no.
  Following is N line, each consisting of a string of length D. e jth character in the ith one of these lines denotes whether people i would accept drink j. “Y” for yes and “N” for no.
  Please process until EOF (End Of File).

Output
  For each test case, please print a single line with one integer, the maximum number of people to be satisfied.

Sample Input
 
 
4 3 3 1 1 1 1 1 1 YYN NYY YNY YNY YNY YYN YYN NNY

Sample Output
 
 
3

Source

Recommend
liuyiding
 
题解:比赛的时候没看 现在看了一下很简单的网络流问题 开一个F+D+2*N+2的一个网络 源点与各个食物点F相连 权值为各个食物的权值 再将食物点按照字符条件 将食物点与前N个顾客点对应条件一一相连 权值为1 为了保证顾客不会获得两种或者两种以上的食物或饮料 将前N个顾客点与后N个顾客点相连 权值为1 再将后N个顾客点与饮料点相连 权值为1 再将饮料点与汇点相连 就可以找最大值了 这题起初我还考虑有的顾客只要食物 或者有的顾客只要饮料 但是这种测试数据里好像没有 所以我程序也没加
 
#include <iostream>
#include<cstdio>
#include<cstring>

using namespace std;
const int oo=1e9;
/**oo表示无穷大*/
const int mm=111111111;
/**mm表示边的最大数量,记住要是原图的两倍,在加边的时候都是双向的*/
const int mn=9999999;
/**mn表示点的最大数量*/
int node,src,dest,edge;
/**node表示节点数,src表示源点,dest表示汇点,edge统计边数*/
int ver[mm],flow[mm],next[mm];
/**ver 边指向的节点,flow 边的容量 ,next 链表的下一条边*/
int head[mn],work[mn],dis[mn],q[mn];
/**head 节点的链表头,work 用于算法中的临时链表头,dis 计算距离*/

/**初始化链表及图的信息*/
void prepare(int _node,int _src,int _dest)
{
    node=_node,src=_src,dest=_dest;
    for(int i=0; i<node; ++i)head[i]=-1;
    edge=0;
}
/**增加一条u到v容量为c的边*/
void addedge(int u,int v,int c)
{
    ver[edge]=v,flow[edge]=c,next[edge]=head[u],head[u]=edge++;
    ver[edge]=u,flow[edge]=0,next[edge]=head[v],head[v]=edge++;
}
/**广搜计算出每个点与源点的最短距离,如果不能到达汇点说明算法结束*/
bool Dinic_bfs()
{
    int i,u,v,l,r=0;
    for(i=0; i<node; ++i)dis[i]=-1;
    dis[q[r++]=src]=0;
    for(l=0; l<r; ++l)
        for(i=head[u=q[l]]; i>=0; i=next[i])
            if(flow[i]&&dis[v=ver[i]]<0)
            {
                /**这条边必须有剩余容量*/
                dis[q[r++]=v]=dis[u]+1;
                if(v==dest)return 1;
            }
    return 0;
}
/**寻找可行流的增广路算法,按节点的距离来找,加快速度*/
int Dinic_dfs(int u,int exp)
{
    if(u==dest)return exp;
    /**work是临时链表头,这里用i引用它,这样寻找过的边不再寻找*/
    for(int &i=work[u],v,tmp; i>=0; i=next[i])
        if(flow[i]&&dis[v=ver[i]]==dis[u]+1&&(tmp=Dinic_dfs(v,min(exp,flow[i])))>0)
        {
            flow[i]-=tmp;
            flow[i^1]+=tmp;
            /**正反向边容量改变*/
            return tmp;
        }
    return 0;
}
/**求最大流,直到没有可行流*/
int Dinic_flow()
{
    int i,ret=0,delta;
    while(Dinic_bfs())
    {
        for(i=0; i<node; ++i)work[i]=head[i];
        while(delta=Dinic_dfs(src,oo))ret+=delta;
    }
    return ret;
}

int main()
{
    int n,f,d,ef,ed,ans;
    string sf,sd;
    while(cin>>n>>f>>d)
    {
        prepare(f+d+2*n+2,0,f+d+2*n+1);
        for(int i=1; i<=f; i++)
        {
            cin>>ef;
            addedge(src,i,ef);
        }
        for(int i=1; i<=d; i++)
        {
            cin>>ed;
            addedge(f+n+n+i,dest,ed);
        }
        for(int i=1; i<=n; i++)
        {
            addedge(f+i,f+n+i,1);
            cin>>sf;
            for(int j=0; j<f; j++)
                if(sf[j]=='Y')
                    addedge(j+1,f+i,1);
        }
        for(int i=1; i<=n; i++)
        {
            cin>>sd;
            for(int j=0; j<d; j++)
                if(sd[j]=='Y')
                    addedge(f+n+i,f+n+n+j+1,1);
        }
        ans=Dinic_flow();
        cout<<ans<<endl;
    }

    return 0;
}

目录
相关文章
|
6月前
|
机器学习/深度学习 人工智能 BI
2019ICPCshenyang网络赛(C. Dawn-K's water)
2019ICPCshenyang网络赛(C. Dawn-K's water)
2021 ICPC Asia Regionals Online Contest (II) Problem G. Limit
2021 ICPC Asia Regionals Online Contest (II) Problem G. Limit
The Preliminary Contest for ICPC China Nanchang National Invitational H题 Coloring Game
The Preliminary Contest for ICPC China Nanchang National Invitational H题 Coloring Game
86 0
|
机器学习/深度学习 人工智能
The Preliminary Contest for ICPC China Nanchang National Invitational K题 MORE XOR
The Preliminary Contest for ICPC China Nanchang National Invitational K题 MORE XOR
71 0
|
机器学习/深度学习
The Preliminary Contest for ICPC China Nanchang National Invitational J题 Distance on the tree
The Preliminary Contest for ICPC China Nanchang National Invitational J题 Distance on the tree
92 0
The Preliminary Contest for ICPC China Nanchang National Invitational A题 PERFECT NUMBER PROBLEM
The Preliminary Contest for ICPC China Nanchang National Invitational A题 PERFECT NUMBER PROBLEM
69 0
|
机器学习/深度学习 BI
2020-2021 ACM-ICPC, Asia Seoul Regional Contest L. Two Buildings (决策单调性 分治)
2020-2021 ACM-ICPC, Asia Seoul Regional Contest L. Two Buildings (决策单调性 分治)
131 0
2020-2021 ACM-ICPC, Asia Seoul Regional Contest L. Two Buildings (决策单调性 分治)
|
人工智能 Java
2012 ACM/ICPC Asia Regional Changchun Online-LianLianKan
题意:类似于我们玩的连连看,从上往下,6个水果内如果有相同的2个水果则可以消去,直至水果被消完,输出1,或是找不到可以消去的水果,输出0。
110 0
2012 ACM/ICPC Asia Regional Tianjin Online-Faulty Odometer
题意:有个特殊汽车的行程表,每逢数字3和8会跳过直接到4和9,给你一个行程表的示数,求汽车实际走的路程。
131 0