PIGS
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 20253   Accepted: 9252

Description

Mirko works on a pig farm that consists of M locked pig-houses and Mirko can't unlock any pighouse because he doesn't have the keys. Customers come to the farm one after another. Each of them has keys to some pig-houses and wants to buy a certain number of pigs. 
All data concerning customers planning to visit the farm on that particular day are available to Mirko early in the morning so that he can make a sales-plan in order to maximize the number of pigs sold. 
More precisely, the procedure is as following: the customer arrives, opens all pig-houses to which he has the key, Mirko sells a certain number of pigs from all the unlocked pig-houses to him, and, if Mirko wants, he can redistribute the remaining pigs across the unlocked pig-houses. 
An unlimited number of pigs can be placed in every pig-house. 
Write a program that will find the maximum number of pigs that he can sell on that day.

Input

The first line of input contains two integers M and N, 1 <= M <= 1000, 1 <= N <= 100, number of pighouses and number of customers. Pig houses are numbered from 1 to M and customers are numbered from 1 to N. 
The next line contains M integeres, for each pig-house initial number of pigs. The number of pigs in each pig-house is greater or equal to 0 and less or equal to 1000. 
The next N lines contains records about the customers in the following form ( record about the i-th customer is written in the (i+2)-th line): 
A K1 K2 ... KA B It means that this customer has key to the pig-houses marked with the numbers K1, K2, ..., KA (sorted nondecreasingly ) and that he wants to buy B pigs. Numbers A and B can be equal to 0.

Output

The first and only line of the output should contain the number of sold pigs.

Sample Input

3 3
3 1 10
2 1 2 2
2 1 3 3
1 2 6

Sample Output

7

DINIC练习,题目的建图值的注意!
  1 #include<cstdio>
2 #include<iostream>
3 #include<cstring>
4 #include<queue>
5 #include<vector>
6
7 using namespace std;
8 const int inf=0x7fffffff;
9 int n,m;
10 int map[110][110];
11 int house[1010];
12 int fir[1010]={0};
13 int lays[110];
14 bool vis[110]={0};
15 bool bfs()
16 {
17 memset(lays,-1,sizeof(lays));
18 queue<int>q;
19 lays[0]=0;
20 q.push(0);
21 while(!q.empty())
22 {
23 int u=q.front();q.pop();
24 for(int i=1;i<=n+1;i++)
25 if(map[u][i]>0&&lays[i]==-1)
26 {
27 lays[i]=lays[u]+1;
28 if(i==n+1)return 1;
29 else q.push(i);
30 }
31 }
32 return 0;
33 }
34 int dinic()
35 {
36 int maxf=0;
37 vector<int>q;
38 while(bfs())
39 {
40 memset(vis,0,sizeof(vis));
41 q.push_back(0);
42 vis[0]=1;
43 while(!q.empty())
44 {
45 int nd=q.back();
46 if(nd==n+1)
47 {
48 int minn,minx=0x7fffffff;
49 for(int i=1;i<q.size();i++)
50 {
51 int u=q[i-1],v=q[i];
52 if(map[u][v]<minx)
53 {
54 minx=map[u][v];
55 minn=u;
56 }
57 }
58 maxf+=minx;
59 for(int i=1;i<q.size();i++)
60 {
61 int u=q[i-1],v=q[i];
62 map[u][v]-=minx;
63 map[v][u]+=minx;
64 }
65 while(!q.empty()&&q.back()!=minn)
66 {
67 vis[q.back()]=0;
68 q.pop_back();
69 }
70 }
71 else
72 {
73 int i;
74 for(i=0;i<=n+1;i++)
75 {
76 if(map[nd][i]>0&&lays[i]==lays[nd]+1&&!vis[i])
77 {
78 q.push_back(i);
79 vis[i]=1;
80 break;
81 }
82 }
83 if(i>n+1)q.pop_back();
84 }
85 }
86 }
87 return maxf;
88 }
89 int main()
90 {
91 cin>>m>>n;
92 for(int i=1;i<=m;i++)
93 scanf("%d",house+i);
94 for(int i=1;i<=n;i++)
95 {
96 int keys;
97 scanf("%d",&keys);
98 for(int j=0;j<keys;j++)
99 {
100 int keyn;
101 scanf("%d",&keyn);
102 if(fir[keyn]==0)map[0][i]+=house[keyn];
103 else map[fir[keyn]][i]=inf;
104 fir[keyn]=i;
105 }
106 int pigs;
107 scanf("%d",&pigs);
108 map[i][n+1]=pigs;
109 }
110 cout<<dinic()<<endl;
111 return 0;
112 }

PIGS_POJ1149的更多相关文章

随机推荐

  1. [leetcode]29. Divide Two Integers不用除法实现除法

    思路是不断将被除数分为两部分,每次分的一部分都是尽量大的除数的倍数,然后最后的商就是倍数加上剩下的部分再分,知道不够大. 递归实现 剩下的难点就是,正负号(判断商正负后将两个数都取绝对值),数太大(将 ...

  2. jQuery作业 点击显示

    代码如下: 里: 导入jQuery包: 里:内容 水果 苹果 橘子 梨子 香蕉 化妆品 口红 眼影 腮红 高光 护肤品 水 乳 霜 精华

  3. 痞子衡嵌入式:MCUXpresso IDE下添加新路径下源文件进工程编译的方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下添加新路径下源文件进工程编译的方法. 接着上篇文章 <MCUXpresso IDE下SDK工程导入与 ...

  4. Playwright VS Selenium VS Puppeteer VS Cypress

    参考:https://www.testim.io/blog/puppeteer-selenium-playwright-cypress-how-to-choose/ 这四款自动化测试框架在我们的公众号 ...

  5. 三目运算符(C++)

    一.简介 固定格式 ?: 三目运算符:可用于赋值语句 三目运算表达式:<表达式1>?<表达式2>:<表达式3> 注:"?"运算符的含义是: 先求 ...

  6. user&group_management.md

    登录shell bin/bash sbin/nologin useradd 的参数     -c  comment 用户的注释性信息     -u UID 指定用户的UID     -g initia ...

  7. sql查询速度慢分析及如何优化查询

    原因分析后台数据库中数据过多,未做数据优化数据请求-解析-展示处理不当 网络问题提高数据库查询的速度方案SQL 查询速度慢的原因有很多,常见的有以下几种:1.没有索引或者没有用到索引(查询慢最常见的问 ...

  8. ASP.NET Core中的数据保护

    在这篇文章中,我将介绍ASP.NET Core 数据保护系统:它是什么,为什么我们需要它,以及它如何工作. 为什么我们需要数据保护系统? 数据保护系统是ASP.NET Core使用的一组加密api.加 ...

  9. 牛客网NC15二叉树的层次遍历

    题目 给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历) 例如: 给定的二叉树是{3,9,20,#,#,15,7}, 该二叉树层序遍历的结果是 [ [3], [9,20], [1 ...

  10. Openstack glance 镜像服务 (五)

    Openstack glance 镜像服务 (五) 引用: 官方文档glance安装 https://docs.openstack.org/ocata/zh_CN/install-guide-rdo/ ...