Food

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

邻接矩阵 DINIC    在定点数较多的时候比较慢。time  608 ms   。邻接表可以加速

  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 }

time  124ms

  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 = 805;
19 const int SIZE = 200005;
20
21
22 struct edge
23 {
24 int v,w,next;
25 }edges[SIZE];
26
27 int head[MS];
28 int level[MS];
29 int que[MS];
30 int qs,qe,cnt;
31 int n,f,d;
32 int src,des;
33
34 void add(int u,int v,int w)
35 {
36 edges[cnt].v=v;edges[cnt].w=w;edges[cnt].next=head[u];head[u]=cnt++;
37 edges[cnt].v=u;edges[cnt].w=0;edges[cnt].next=head[v];head[v]=cnt++;
38 }
39
40 int BFS()
41 {
42 memset(level,-1,sizeof(level));
43 qs=qe=0;
44 level[src]=0;
45 que[qe++]=src;
46 while(qs<qe)
47 {
48 int u=que[qs++];
49 for(int i=head[u];i!=-1;i=edges[i].next)
50 {
51 int v=edges[i].v;
52 if(level[v]<0&&edges[i].w>0)
53 {
54 level[v]=level[u]+1;
55 que[qe++]=v;
56 }
57 }
58 }
59 return level[des]>0;
60 }
61
62 int DFS(int u,int minv)
63 {
64 if(u==des)
65 return minv;
66 int t;
67 for(int i=head[u];i!=-1;i=edges[i].next)
68 {
69 int v=edges[i].v;
70 if(edges[i].w>0&&level[v]==level[u]+1&&(t=DFS(v,min(edges[i].w,minv))))
71 {
72 edges[i].w-=t;
73 edges[i^1].w+=t;
74 return t;
75 }
76 }
77 level[u]=-1; // 从u出发无法找到argument
78 return 0;
79 }
80
81
82 int main()
83 {
84 while(scanf("%d%d%d",&n,&f,&d)!=EOF)
85 {
86 memset(head,-1,sizeof(head));
87 int w;
88 char str[MS];
89 des=f+2*n+d+1;
90 src=cnt=0;
91 for(int i=1;i<=f;i++)
92 {
93 scanf("%d",&w);
94 add(src,i,w);
95 }
96 // 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;
97 for(int i=1;i<=n;i++)
98 add(f+i,f+n+i,1);
99 for(int i=1;i<=d;i++)
100 {
101 scanf("%d",&w);
102 add(f+2*n+i,des,w);
103 }
104 for(int i=1;i<=n;i++)
105 {
106 scanf("%s",str);
107 for(int j=0;j<f;j++)
108 {
109 if(str[j]=='Y')
110 {
111 add(j+1,f+i,1);
112 }
113 }
114 }
115
116 for(int i=1;i<=n;i++)
117 {
118 scanf("%s",str);
119 for(int j=0;j<d;j++)
120 {
121 if(str[j]=='Y')
122 {
123 add(f+n+i,f+2*n+j+1,1);
124 }
125 }
126 }
127 int ans=0;
128 int t;
129 while(BFS())
130 {
131 while(t=DFS(src,INF))
132 {
133 ans+=t;
134 }
135 }
136 printf("%d\n",ans);
137 }
138 return 0;
139 }

这题和poj  3281基本上是一样的。链接:Dining

Dining是每种食物和饮料只能分配给一个人。所以可以把容量看成1. 可以看成是一样的题目。  DINIC()  0ms;

  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 = 805;
19 const int SIZE = 200005;
20
21
22 struct edge
23 {
24 int v,w,next;
25 }edges[SIZE];
26
27 int head[MS];
28 int level[MS];
29 int que[MS];
30 int qs,qe,cnt;
31 int n,f,d;
32 int src,des;
33
34 void add(int u,int v,int w)
35 {
36 edges[cnt].v=v;edges[cnt].w=w;edges[cnt].next=head[u];head[u]=cnt++;
37 edges[cnt].v=u;edges[cnt].w=0;edges[cnt].next=head[v];head[v]=cnt++;
38 }
39
40 int BFS()
41 {
42 memset(level,-1,sizeof(level));
43 qs=qe=0;
44 level[src]=0;
45 que[qe++]=src;
46 while(qs<qe)
47 {
48 int u=que[qs++];
49 for(int i=head[u];i!=-1;i=edges[i].next)
50 {
51 int v=edges[i].v;
52 if(level[v]<0&&edges[i].w>0)
53 {
54 level[v]=level[u]+1;
55 que[qe++]=v;
56 }
57 }
58 }
59 return level[des]>0;
60 }
61
62 int DFS(int u,int minv)
63 {
64 if(u==des)
65 return minv;
66 int t;
67 for(int i=head[u];i!=-1;i=edges[i].next)
68 {
69 int v=edges[i].v;
70 if(edges[i].w>0&&level[v]==level[u]+1&&(t=DFS(v,min(edges[i].w,minv))))
71 {
72 edges[i].w-=t;
73 edges[i^1].w+=t;
74 return t;
75 }
76 }
77 level[u]=-1; // 从u出发无法找到argument
78 return 0;
79 }
80
81
82 int main()
83 {
84 while(scanf("%d%d%d",&n,&f,&d)!=EOF)
85 {
86 memset(head,-1,sizeof(head));
87 int w;
88 char str[MS];
89 des=f+2*n+d+1;
90 src=cnt=0;
91 for(int i=1;i<=f;i++)
92 add(src,i,1);
93 // 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;
94 for(int i=1;i<=n;i++)
95 add(f+i,f+n+i,1);
96 for(int i=1;i<=d;i++)
97 add(f+2*n+i,des,1);
98 int fsum,dsum,t;
99 for(int i=1;i<=n;i++)
100 {
101 scanf("%d%d",&fsum,&dsum);
102 for(int j=1;j<=fsum;j++)
103 {
104 scanf("%d",&t);
105 add(t,f+i,1);
106 }
107 for(int j=1;j<=dsum;j++)
108 {
109 scanf("%d",&t);
110 add(f+n+i,f+2*n+t,1);
111 }
112 }
113 int ans=0;
114 while(BFS())
115 {
116 while(t=DFS(src,INF))
117 {
118 ans+=t;
119 }
120 }
121 printf("%d\n",ans);
122 }
123 return 0;
124 }

HDU 4292 Food 多源多汇入门题的更多相关文章

  1. HDU 1284 钱币兑换问题(全然背包:入门题)

    HDU 1284 钱币兑换问题(全然背包:入门题) http://acm.hdu.edu.cn/showproblem.php?pid=1284 题意: 在一个国家仅有1分,2分.3分硬币,将钱N ( ...

  2. hdu 1166敌兵布阵(线段树入门题)

    >>点击进入原题测试<< 思路:这两天在学线段树,这个题直接手敲一下线段树就行了,都没有用上懒人标记.入门题 cin,cout会超时,记得加std::ios::sync_wit ...

  3. hdu 2993 MAX Average Problem(斜率DP入门题)

    题目链接:hdu 2993 MAX Average Problem 题意: 给一个长度为 n 的序列,找出长度 >= k 的平均值最大的连续子序列. 题解: 这题是论文的原题,请参照2004集训 ...

  4. HDU 2089 不要62【数位DP入门题】

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  5. HDU 1241 连通块问题(DFS入门题)

    Input The input file contains one or more grids. Each grid begins with a line containing m and n, th ...

  6. HDU 1251 裸的字典树、入门题

    裸的字典树还是挺简单的. 四个基本操作建立.查找.插入.删除 建立新结点我是用的c++中 new操作.当然也可以用malloc,都方便 不过指针阿.地址阿.这其中关系什么的我貌似还不是很清楚阿. 因为 ...

  7. hdu 3695:Computer Virus on Planet Pandora(AC自动机,入门题)

    Computer Virus on Planet Pandora Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 256000/1280 ...

  8. poj1459 Power Network (多源多汇最大流)

    Description A power network consists of nodes (power stations, consumers and dispatchers) connected ...

  9. hdu 1465:不容易系列之一(递推入门题)

    不容易系列之一 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

随机推荐

  1. SecureCRT配置自动记录日志

    很多人用SecureCRT时,希望自动记录日志,一个是方便以后查阅,一个是对自己的操作有个记录.可以看看自己做了什么操作,有时甚至可以看看之前是不是犯了什么错,是个很不错的功能. 设置很简单,还可以根 ...

  2. linux中级之HAProxy基础配置

    一.haproxy简介 HAProxy是一款提供高可用性.负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,HAProxy是完全免费的.借助HAProxy可以快速并且可靠的提供基于T ...

  3. Qt 进度条

    一.前言 有时我们需要在表格(QTableWidget).树状栏(QTreeWidget)中直观显示任务进度或消耗百分比,达到报表显示的形式,可通过重写QLabel的方式实现. 1.进度条控件功能 1 ...

  4. JS中的高阶函数

    JS中的高阶函数 高阶函数是指以函数作为参数的函数,并且可以将函数作为结果返回的函数. 1. 高阶函数 接受一个或多个函数作为输入 输出一个函数 至少满足以上一个条件的函数 在js的内置对象中同样存在 ...

  5. Question&&Answer

    1.使用Navicat连接Ubuntu上面的MySql数据库失败 解决办法:Navicat版本的问题,尝试换用更高版本的Navicat解决了问题(当时使用了Navicat Premium_11.2.7 ...

  6. 3D网页小实验-基于Babylon.js与recast.js实现RTS式单位控制

    一.运行效果 1.建立一幅具有地形起伏和不同地貌纹理的地图: 地图中间为凹陷的河道,两角为突出的高地,高地和低地之间以斜坡通道相连. 水下为沙土材质,沙土材质网格贴合地形,河流材质网格则保持水平. 2 ...

  7. GO学习-(35) Go实现日志收集系统4

    Go实现日志收集系统4   到这一步,我的收集系统就已经完成很大一部分工作,我们重新看一下我们之前画的图: 我们已经完成前面的部分,剩下是要完成后半部分,将kafka中的数据扔到ElasticSear ...

  8. Selenium 库的基本用法

    Selenium库的基本使用   1.基本使用 from selenium import webdriver from selenium.webdriver.common.by import By f ...

  9. Jmeter- 笔记12 - 性能测试分析 & 性能测试流程

    性能测试分析 场景设计.监视图表: 设计场景:阶梯式.波浪式 监视器: 收集用于性能分析的数据:TPS图表.聚合报告\汇总报告.察看结果树.响应时间.吞吐量 服务器资源监控:cpu.内存.磁盘io 分 ...

  10. 原子层沉积(ALD)和化学气相沉积(CVD)微电子制造铜金属化的研究进展

    原子层沉积(ALD)和化学气相沉积(CVD)微电子制造铜金属化的研究进展 Atomic Layer Deposition (ALD) and Chemical Vapor Deposition (CV ...