hoj 2634

【题目大意】
有M个项目和N个员工。做项目i可以获得Ai元,但是必须雇用若干个指定的员工。雇用员工j需要花费Bj元,且一旦雇用,员工j可以参加多个项目的开发。问经过合理的项目取舍,最多能挣多少钱。(1 <= M, N <= 100)

蕴含式最大获利问题。。建出最大权闭合子图,答案为sum(a[i])-最小割

 1 //#include<bits/stdc++.h>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<queue>
 6 #include<iostream>
 7 #define inc(i,l,r) for(int i=l;i<=r;i++)
 8 #define dec(i,l,r) for(int i=l;i>=r;i--)
 9 #define link(x) for(edge *j=h[x];j;j=j->next)
10 #define mem(a) memset(a,0,sizeof(a))
11 #define inf 1e9
12 #define ll long long
13 #define succ(x) (1<<x)
14 #define NM 300
15 #define nm 100000
16 using namespace std;
17 int read(){
18     int x=0,f=1;char ch=getchar();
19     while(!isdigit(ch)){if(ch==‘-‘)f=-1;ch=getchar();}
20     while(isdigit(ch))x=x*10+ch-‘0‘,ch=getchar();
21     return x*f;
22 }
23 struct edge{
24     int t,v;
25     edge *next,*rev;
26 }e[nm],*h[NM],*p;
27 void _add(int x,int y,int v){
28     p->t=y;p->v=v;p->next=h[x];h[x]=p;p++;
29 }
30 void add(int x,int y,int v){
31     _add(x,y,v);_add(y,x,0);
32     h[x]->rev=h[y];h[y]->rev=h[x];
33 }
34 int n,m,_t,d[NM],T,_x,s;
35 bool v[NM];
36 queue<int >q;
37 int bfs(){
38     mem(d);mem(v);
39     v[0]++;d[0]++;q.push(0);
40     while(!q.empty()){
41         int t=q.front();q.pop();
42         link(t)
43         if(j->v&&!v[j->t])
44         v[j->t]++,q.push(j->t),d[j->t]=d[t]+1;
45     }
46     return d[n];
47 }
48 int dfs(int x,int k){
49     int _a;
50     if(x==n)return k;
51     link(x)
52     if(j->v&&d[j->t]==d[x]+1&&(_a=dfs(j->t,min(j->v,k)))){
53         j->v-=_a;j->rev->v+=_a;return _a;
54     }
55     return 0;
56 }
57 int main(){
58     T=read();
59     while(T--){
60         p=e;mem(h);s=0;
61         n=read();m=read();
62         inc(i,1,n){
63             _x=read();s+=_x;
64             add(0,i,_x);
65         }
66         inc(i,1,m)add(i+n,n+m+1,read());
67         inc(i,1,n){
68             _x=read();
69             inc(j,1,_x)
70             add(i,n+1+read(),inf);
71         }
72         n=n+m+1;
73         while(bfs())
74         if(_t=dfs(0,inf))s-=_t;
75         printf("%d\n",s);
76     }
77     return 0;
78 }

时间: 2024-10-26 03:56:01

hoj 2634的相关文章

HOJ 2634 How to earn more

How to earn more My Tags   (Edit)   Source : ww   Time limit : 1 sec   Memory limit : 64 M Submitted : 381, Accepted : 217 Xiao Ming is an expert in computer science and technology, so he can get a lot of projects every month. The projects always bri

网络流专栏

最大流 POJ 1273 Drainage Ditches POJ 1274 The Perfect Stall (二分图匹配) POJ 1698 Alice's Chance(构图) POJ 1459 Power Network(构图) POJ 2112 Optimal Milking (二分) POJ 2455 Secret Milking Machine (二分) POJ 3189 Steady Cow Assignment (枚举) POJ 1637 Sightseeing tour (

Soj题目分类

-----------------------------最优化问题------------------------------------- ----------------------常规动态规划  SOJ1162 I-Keyboard  SOJ1685 Chopsticks SOJ1679 Gangsters SOJ2096 Maximum Submatrix  SOJ2111 littleken bg SOJ2142 Cow Exhibition  SOJ2505 The County

网络流柱

最大流量 POJ 1273 Drainage Ditches POJ 1274 The Perfect Stall (二分图匹配) POJ 1698 Alice's Chance(构图) POJ 1459 Power Network(构图) POJ 2112 Optimal Milking (二分) POJ 2455 Secret Milking Machine (二分) POJ 3189 Steady Cow Assignment (枚举) POJ 1637 Sightseeing tour

待刷题目分类

各大OJ题目归类 Posted on 2012 年 8 月 8 日 by admin ---------–最优化问题------------- --------动态规划 SOJ1162 I-Keyboard SOJ2096 Maximum Submatrix SOJ2111 littleken bg SOJ2505 The County Fair SOJ2818 QQ音速 SOJ2469 Exploring Pyramids SOJ1833 Base Numbers SOJ2009 Zeros

网络流题集

最大流POJ 1273 Drainage DitchesPOJ 1274 The Perfect Stall (二分图匹配)POJ 1698 Alice's Chance(构图)POJ 1459 Power Network(构图)POJ 2112 Optimal Milking (二分)POJ 2455 Secret Milking Machine (二分)POJ 3189 Steady Cow Assignment (枚举)POJ 1637 Sightseeing tour (混合图欧拉回路)

最大权闭合子图(最小割)

最大权闭合子图(最大流最小割) •参考资料 [1]最大权闭合子图 •权闭合子图 存在一个图的子图,使得子图中的所有点出度指向的点依旧在这个子图内,则此子图是闭合子图. 在这个图中有8个闭合子图:∅,{3},{4},{2,4},{3,4},{1,3,4},{2,3,4},{1,2,3,4} •最大权闭合子图 在一个图中每个点具有点权值,在他的所有闭合子途中点权之和最大的即是最大权闭合子图. •详解 最大权闭合子图 结论 最大权闭合子图权值  =  所有权值为正的权值之和  -  最大流 •步骤 建

HOJ 题目分类

转自:http://blog.sina.com.cn/s/blog_65f3869301011a1o.html ******************************************************************************* 简单题(包括枚举,二分查找,(复杂)模拟,基础数据结构(栈.队列),杂题等 ****************************************************************************

HOJ 1797 Red and Black

传送门  http://acm.hit.edu.cn/hoj/problem/view?id=1797 总体的思路是遍历可以到达的' . ',将其对应的vis数组化为1,然后统计所有为1的vis项; ①常用的加边法,防止越界 ②初始化,不然两次相同的输入得到的结果会不同,由于是二维数组,能力有限,只好在结尾初始化,为下次输入做准备 ③结束条件,递归函数一定要先写好结束条件,不然会炸 ④上下左右四向移动 ⑤直接递归函数调用自身 1 #include <stdio.h> 2 #include &l