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. Win10开启移动热点

    Win10开启移动热点 禁用 无线网卡 启动 无线网卡

  2. Linux ln命令:在文件之间建立链接(硬链接和软链接)详解版1

    Linux ln命令:在文件之间建立链接(硬链接和软链接)详解版 < Linux创建文件及修改文件时间戳(touch命令)Linux复制文件和目录(cp命令) > <Linux就该这 ...

  3. Python菜鸟100例

    题目地址 #-*- codeing = utf-8 -*- #@Time : 2021/3/18 21:17 #@Author : HUGBOY #@File : 1.py #@Software: P ...

  4. Scala 神奇的下划线 _

    引言 在 Scala 中,下划线 _ 有很多种用法,作为 Scala 初学者也经常被下划线 _ 搞得晕头转向,下面是对 Scala 中下划线 _ 使用的简单总结~ 导包时, 下划线 _ 表示引用多个方 ...

  5. Centos7.4 docker安装包下载以及离线安装

    docker安装包下载地址:https://download.docker.com/linux/centos/7/x86_64/stable/Packages/ 需要下载一个selinux包:dock ...

  6. CoSky 高性能 服务注册/发现 & 配置中心

    CoSky 基于 Redis 的服务治理平台(服务注册/发现 & 配置中心) Consul + Sky = CoSky CoSky 是一个轻量级.低成本的服务注册.服务发现. 配置服务 SDK ...

  7. 案例分享:Qt modbus485调试工具(读写Byte、Int、DInt、Real、DReal)(当前v1.3.0)

    前言   西门子PLC.台达PLC.法兰克机床等等多年以前玩得比较多,有tcp/ip通讯也有modbus通讯,modbus又分为网络,485,232等.  医疗项目,焊接机器人项目,工控机床项目,数控 ...

  8. synchronized 的超多干货!

    前言 synchronized 这个关键字的重要性不言而喻,几乎可以说是并发.多线程必须会问到的关键字了.synchronized 会涉及到锁.升级降级操作.锁的撤销.对象头等.所以理解 synchr ...

  9. cachecloud生产环境搭建

    步骤 1 机器管理 机器初始化Redis环境 添加机器  执行:  cachecloud-init.sh脚本 2 cachecloud添加机器的时候需要添加一个用户cachecloud-open ad ...

  10. TheSuperego 实验五 团队作业2:毕业设计选题系统

    项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST 这个作业要求链接 https://www.cnblogs.com/nwnu-dai ...