poj3436 ACM Computer Factory

题意:

  n个工厂加工电脑,电脑有p个部件。每个工厂加工的电脑必须是满足它对原材料的需求。p个部件,0代表不能有,1必须有,2代表可有可无。然后经过加工后,这个工厂输出的电脑各个部件的情况,0代表没有,1代表有。每个工厂有一个生产效率。求单位时间内的最多能生产的完整电脑数量。

解决:

  每个工厂拆成两个点,流量为该工厂效率。超级源连接对p个部件需求都为0的工厂,超级汇连接输出p个部件都为1的工厂 。求一次最大流。

 

 

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <queue>
  4 #include <climits>
  5 
  6 const int MAXN = 100 + 20;
  7 const int INF = INT_MAX;
  8 
  9 int g[MAXN];
 10 
 11 int n, p;
 12 
 13 struct Mach{
 14     int q, in[11], out[11];
 15 }mach[MAXN<<2];
 16 
 17 struct Edge{
 18     int v, f, pre;
 19 }e[MAXN*MAXN], e_bak[MAXN*MAXN];
 20 int e_n;
 21 
 22 struct Flow{
 23     int u, v, f;
 24 }flow[MAXN<<2];
 25 int f_e;
 26 
 27 int layer[MAXN];
 28 
 29 int dfs(int u, int sink, int flow)
 30 {
 31     if(u == sink)
 32         return flow;
 33     int now_flow = 0;
 34     for(int i = g[u]; i && flow; i = e[i].pre){
 35         int v = e[i].v;
 36         int f = e[i].f;
 37         if(f > 0 && layer[v] == layer[u] + 1){
 38             int d = dfs(v, sink, std::min(f, flow));
 39             e[i].f -= d;
 40             e[i^1].f += d;
 41             flow -= d;
 42             now_flow += d;
 43         }
 44     }
 45     return now_flow;
 46 }
 47 
 48 void bfs(int src, int sink)
 49 {
 50     memset(layer, -1, sizeof layer);
 51     std::queue<int> que;
 52     que.push(src);
 53     layer[src] = 0;
 54     while(que.empty() == false){
 55         int u = que.front();
 56         que.pop();
 57         for(int i = g[u]; i; i = e[i].pre){
 58             int v = e[i].v;
 59             int f = e[i].f;
 60             if(f > 0 && layer[v] == -1){
 61                 que.push(v);
 62                 layer[v] = layer[u] + 1;
 63             }
 64         }
 65     }
 66 }
 67 
 68 int dinic(int src, int sink)
 69 {
 70     int res = 0;
 71     while(true){
 72         bfs(src, sink);
 73         if(layer[sink] == -1){
 74             return res;
 75         }
 76         res += dfs(src, sink, INF);
 77     }
 78 }
 79 
 80 
 81 
 82 void addEdge(int u, int v, int f)
 83 {
 84     ++ e_n;
 85     e[e_n].v = v;
 86     e[e_n].f = f;
 87     e[e_n].pre = g[u];
 88     g[u] = e_n;
 89     
 90     ++e_n;
 91     e[e_n].v = u;
 92     e[e_n].f = 0;
 93     e[e_n].pre = g[v];
 94     g[v] = e_n;
 95 }
 96 
 97 void init()
 98 {
 99     e_n = 1;
100     f_e = 0;
101     memset(g, 0, sizeof g);
102     memset(e, 0, sizeof e);
103     memset(e_bak, 0, sizeof e_bak);
104     memset(flow, 0, sizeof flow);
105     memset(mach, 0, sizeof mach);
106 }
107 
108 int main()
109 {
110     while(~scanf("%d%d", &p, &n)){
111         init();
112         //scanf("%d%d", &p, &n);
113         int src = 0;
114         int sink = n*2+1;
115         // input
116         for(int i = 1; i <= n; ++ i){
117             scanf("%d", &mach[i].q);
118             for(int j = 1; j <= p; ++ j){
119                 scanf("%d", &mach[i].in[j]);
120             }
121             for(int j = 1; j <= p; ++ j){
122                 scanf("%d", &mach[i].out[j]);
123             }    
124             addEdge(i, i+n, mach[i].q);
125         }
126         // addEdge
127         for(int i = 1; i <= n; ++ i){
128             bool ok = true;
129             for(int j = 1; j <= p; ++ j){
130                 if(mach[i].in[j] == 1){
131                     ok = false;
132                     break;
133                 }
134             }
135             if(ok == true){
136                 addEdge(src, i, INF);
137             }
138     
139             ok = true;
140             for(int j = 1; j <= p; ++ j){
141                 if(mach[i].out[j] != 1){
142                     ok = false;
143                     break;
144                 }
145             }
146             if(ok == true){
147                 addEdge(i+n, sink, INF);
148             }
149     
150             for(int j = 1; j <= n; ++ j){
151                 if(i == j){
152                     continue;
153                 }
154                 ok = true;
155                 for(int k = 1; k <= p; ++ k){
156                     if(mach[i].in[k] == 1 && mach[j].out[k] == 0){
157                         ok = false;
158                         break;
159                     }
160                     if(mach[i].in[k] == 0 && mach[j].out[k] == 1){
161                 
162                         ok = false;
163                         break;
164                     }
165                 }
166                 if(ok == true){
167                     addEdge(j+n, i, INF);
168                 }
169             }
170         }
171     
172         for(int i = 2; i <= e_n; ++ i){
173             e_bak[i] = e[i];
174         }
175 
176         printf("%d ", dinic(src, sink));
177 
178         for(int u = n+1; u <= n*2; ++ u){
179             for(int i = g[u]; i; i = e[i].pre){
180                 int v = e[i].v;
181                 if(v == 0 || v > n)
182                     continue;
183                 int f = e[i].f;
184                 int f_bak = e_bak[i].f;
185                 if(f_bak > f){
186                     f_e ++;
187                     flow[f_e].u = u-n;
188                     flow[f_e].v = v;
189                     flow[f_e].f = f_bak - f;
190                 }
191             }
192         }
193         printf("%d\n", f_e);
194         for(int i = 1; i <= f_e; ++ i){
195             printf("%d %d %d\n", flow[i].u, flow[i].v, flow[i].f);
196         }
197     }
198 }

 

posted on 2015-07-19 10:01  TakeoffYoung 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/takeoffyoung/p/4658217.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
未来社区的建设背景和需求分析指出,随着智能经济、大数据、人工智能、物联网、区块链、云计算等技术的发展,社区服务正朝着数字化、智能化转型。社区服务渠道由分散向统一融合转变,服务内容由通用庞杂向个性化、服务导向转变。未来社区将构建数字化生态,实现数据在线、组织在线、服务在线、产品智能和决策智能,赋能企业创新,同时注重人才培养和科研平台建设。 规划设计方面,未来社区将基于居民需求,打造以服务为中心的社区管理模式。通过统一的服务平台和应用,实现服务内容的整合和优化,提供灵活多样的服务方式,如推送式、订阅式、热点式等。社区将构建数据与应用的良性循环,提高服务效率,同时注重生态优美、绿色低碳、社会和谐,以实现幸福民生和产业发展。 建设运营上,未来社区强调科学规划、以人为本,创新引领、重点突破,统筹推进、整体提升。通过实施院落+社团自治工程,转变政府职能,深化社区自治法制化、信息化,解决社区治理中的重点问题。目标是培养有活力的社会组织,提高社区居民参与度和满意度,实现社区治理服务的制度机制创新。 未来社区的数字化解决方案包括信息发布系统、服务系统和管理系统。信息发布系统涵盖公共服务类和社会化服务类信息,提供政策宣传、家政服务、健康医疗咨询等功能。服务系统功能需求包括办事指南、公共服务、社区工作参与互动等,旨在提高社区服务能力。管理系统功能需求则涉及院落管理、社团管理、社工队伍管理等,以实现社区治理的现代化。 最后,未来社区建设注重整合政府、社会组织、企业等多方资源,以提高社区服务的效率和质量。通过建立社区管理服务综合信息平台,提供社区公共服务、社区社会组织管理服务和社区便民服务,实现管理精简、高效、透明,服务快速、便捷。同时,通过培育和发展社区协会、社团等组织,激发社会化组织活力,为居民提供综合性的咨询和服务,促进社区的和谐发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值