码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 4292 Food 多源多汇入门题

时间:2015-04-21 00:09:28      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:

                    Food

 

有F种食物和D种饮料,每种食物或饮料只能供有限次,且每个人只享用一种食物和一种饮料。现在有n个人,每个人都有自己喜欢的食物种类列表和饮料种类列表,问最多能使几个人同时享用到自己喜欢的食物和饮料。

 

技术分享

 

邻接矩阵 DINIC    在定点数较多的时候比较慢。

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <cmath>
  5 #include <algorithm>
  6 #include <string>
  7 #include <vector>
  8 #include <set>
  9 #include <map>
 10 #include <stack>
 11 #include <queue>
 12 #include <sstream>
 13 #include <iomanip>
 14 using namespace std;
 15 typedef long long LL;
 16 const int INF = 0x4fffffff;
 17 const double EXP = 1e-5;
 18 const int MS = 205;
 19 const int SIZE = 100005;
 20 
 21 int edges[4*MS][4*MS];
 22 int level[4*MS];
 23 int que[6*MS];
 24 char str[MS];
 25 int qs,qe;
 26 int n,f,d,cnt;
 27 
 28 bool BFS()
 29 {
 30       memset(level,0xff,sizeof(level));
 31       level[0]=0;
 32       qs=qe=0;
 33       que[qe++]=0;
 34       while(qs<qe)
 35       {
 36             int u=que[qs++];
 37             for(int v=0;v<=cnt;v++)
 38             {
 39                   if(level[v]<0&&edges[u][v]>0)
 40                   {
 41                         level[v]=level[u]+1;
 42                         que[qe++]=v;
 43                   }
 44             }
 45       }
 46       return level[cnt]>0;
 47 }
 48 
 49 int DFS(int u,int minv)
 50 {
 51       if(u==cnt)
 52             return minv;
 53       int t;
 54       for(int v=0;v<=cnt;v++)
 55       {
 56             if(edges[u][v]>0&&level[v]==level[u]+1&&(t=DFS(v,min(minv,edges[u][v]))))
 57             {
 58                   edges[u][v]-=t;
 59                   edges[v][u]+=t;
 60                   return t;
 61             }
 62       }
 63       level[u]=0xff;
 64       return 0;
 65 }
 66 
 67 int main()
 68 {
 69       while(scanf("%d%d%d",&n,&f,&d)!=EOF)
 70       {
 71             memset(edges,0,sizeof(edges));
 72             int w;
 73             for(int i=1;i<=f;i++)
 74             {
 75                   scanf("%d",&w);
 76                   edges[0][i]=w;
 77             }
 78             // 0    1--> f,           f+1--->f+n,           f+n+1  --> f+2*n     f+2*n+1-->f+2*n+d      f+2*n+d+1;
 79             for(int i=1;i<=n;i++)
 80                   edges[f+i][f+n+i]=1;
 81             cnt=f+2*n+d+1;
 82             for(int i=1;i<=d;i++)
 83             {
 84                   scanf("%d",&w);
 85                   edges[f+2*n+i][cnt]=w;
 86             }
 87             for(int i=1;i<=n;i++)
 88             {
 89                   scanf("%s",str);
 90                   for(int j=0;j<f;j++)
 91                   {
 92                         if(str[j]==Y)
 93                         {
 94                               edges[j+1][f+i]=1;
 95                         }
 96                   }
 97             }
 98 
 99             for(int i=1;i<=n;i++)
100             {
101                   scanf("%s",str);
102                   for(int j=0;j<d;j++)
103                   {
104                         if(str[j]==Y)
105                         {
106                               edges[f+n+i][f+2*n+j+1]=1;
107                         }
108                   }
109             }
110             int ans=0;
111             int t;
112             while(BFS())
113             {
114                   while(t=DFS(0,INF))
115                   {
116                         ans+=t;
117                   }
118             }
119             printf("%d\n",ans);
120       }
121       return 0;
122 }

 

HDU 4292 Food 多源多汇入门题

标签:

原文地址:http://www.cnblogs.com/767355675hutaishi/p/4442883.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!