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]86. Partition List分离链表

    /* 这个题是medium的意思应该是用双指针的方法做,如果使用下边的新建链表的方法,就是easy的题目了 双指针会用到很多链表的相连操作 */ public ListNode partition(L ...

  2. Fragment学习

    利用Fragment可以动态的加载页面,减少Activity的数量. 便于开发 类似与html中FragmentSet一样 嵌套在一起,使每个页面为独立的 代码如下: package com.exam ...

  3. java零基础之--【Lombok】简化类设计神器

    I1. 在类设计中我们必不可少的要进行属性定义,构造方法,setter/getter方法,toString方法定义,如果在设计项目中属性过多则会影响类的阅读性. Lombok作为第三方插件,很好的解决 ...

  4. 【并发编程】- 内存模型(针对JSR-133内存模型)篇

    并发编程模型 1.两个关键问题 1)线程之间如何通信 共享内存 程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信 消息传递 程之间没有公共状态,线程之间必须通过发送消息来显式进行通信 ...

  5. 项目API接口鉴权流程总结

    权益需求对接中,公司跟第三方公司合作,有时我们可能作为甲方,提供接口给对方,有时我们也作为乙方,调对方接口,这就需要API使用签名方法(Sign)对接口进行鉴权.每一次请求都需要在请求中包含签名信息, ...

  6. JVM 源码分析(三):深入理解 CAS

    前言 什么是 CAS Java 中的 CAS JVM 中的 CAS 前言 在上一篇文章中,我们完成了源码的编译和调试环境的搭建. 鉴于 CAS 的实现原理比较简单, 然而很多人对它不够了解,所以本篇将 ...

  7. dig的安装和使用

    -bash: dig: command not found 解决办法: yum -y install bind-utils dig www.baid bu.com   查看a记录 dig www.ba ...

  8. Vulnhub靶场——DC-1

    记一次Vulnhub靶场练习记录 靶机DC-1下载地址: 官方地址 https://download.vulnhub.com/dc/DC-1.zip 该靶场共有5个flag,下面我们一个一个寻找 打开 ...

  9. ctfhub技能树—sql注入—时间盲注

    打开靶机 查看页面信息 测试时间盲注 可以看到在执行命令后会有一定时间的等待,确定为时间盲注 直接上脚本 1 #! /usr/bin/env python 2 # _*_ coding:utf-8 _ ...

  10. Getshell

    GetShell 常用免杀大法 一.编码大法 (1).一句话马子本身采用编码 原文:<?php @eval($_GET(a)):?> 转码后:在提交的post的时候可以直接使用\u0026 ...