poj1149最大流经典构图神题
题意:n个顾客依次来买猪,有n个猪房,每个顾客每次可以开若干个房子,买完时,店主可以调整这位顾客
开的猪房里的猪,共m个猪房,每个猪房有若干猪,求最多能卖多少猪。
构图思想:顾客有先后,每个人想要的猪数量已经确定,显然要建汇点t,每个顾客连线t(以顾客为结点),权值为他想要买
的猪数量(最多想要的都卖了,最大流之归宿,必思汇点!)然后,你想,每个顾客有先后顺序,前一个顾客开过的
房子取的猪数量可以重新分配,必然要连后一个开这个房子的顾客连线(权为inf)(相当于前面一个先取该流量,后面的再取,重新分配)
这样建图!如果没有开过的房子怎么办?建立超级源点啊,权值为房子猪数量。这个可以用一个链来存储,
下面代码中fa【】数组实现之即可,记录前一个开过的顾客号码,没有开过的用s连他。
此题经典啊(被大牛定位较难题),关键是这种构图思想。小结一下:先思源汇点(看最大情况),再思哪些作为结点好,
这题每个结点之间有限制,故在先的结点先取源流,再通向下一个被限制的点,这思想很重要。
关于网上流传的简化图三规则,若是或字关系,是错的:
规律1. 如果几个结点的流量的来源完全相同,则可以把它们合并成一个.
规律2. 如果几个结点的流量的去向完全相同,则可以把它们合并成一个.
规律3. 如果从点u到点v有一条容量为∞的边,并且点v除了点u以外没有别的流量来源,则可以把这两个结点合并成一个.
,符合规则1或2,随便举个例子就错了,我认为1,2合为一条,
必需同时满足才可以合并。
#include<iostream> //16 ms 1A
#include<cstdio>
#include<queue>
using namespace std;
int m,n;int numpig[1010];int fa[1010];
int e[10000][3];int nume;int head[110]; const int inf=0x3f3f3f3f;
void addedge(int from,int to,int w)
{
e[nume][0]=to; e[nume][1]=head[from];head[from]=nume;
e[nume++][2]=w;
e[nume][0]=from; e[nume][1]=head[to];head[to]=nume;
e[nume++][2]=0;
}
int level[120];int vis[120];
bool bfs() //dinic
{
for(int i=0;i<=n+1;i++)
vis[i]=level[i]=0;
queue<int>q;q.push(0);
vis[0]=1;
while(!q.empty())
{
int cur=q.front();q.pop();
for(int i=head[cur];i!=-1;i=e[i][1])
{ int v=e[i][0];
if(!vis[v]&&e[i][2]>0)
{
level[v]=level[cur]+1;
if(v==1+n)return 1;
vis[v]=1;
q.push(v);
}
}
}
return vis[1+n];
}
int dfs(int u,int minf)
{
if(u==1+n||minf==0)return minf;
int sumf=0,f;
for(int i=head[u];i!=-1&&minf;i=e[i][1])
{ int v=e[i][0];
if(level[v]==level[u]+1&&e[i][2]>0)
{
f=dfs(v,minf<e[i][2]?minf:e[i][2]);
e[i][2]-=f;e[i^1][2]+=f;
minf-=f;sumf+=f;
}
}
return sumf;
}
int dinic()
{
int sum=0;
while(bfs())
{
sum+=dfs(0,inf);
}
return sum;
}
int main()
{
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++)
{
scanf("%d",&numpig[i]);
fa[i]=0;
}
for(int i=0;i<=n+1;i++)
head[i]=-1;
nume=0;
int numkey,house,numwant;
for(int i=1;i<=n;i++) //构图
{
scanf("%d",&numkey);
while(numkey--)
{
scanf("%d",&house);
addedge(fa[house],i,fa[house]==0?numpig[house]:inf);
fa[house]=i;
}
scanf("%d",&numwant);
addedge(i,n+1,numwant);
}
int ans=dinic();
printf("%d\n",ans);
return 0;
}
poj1149最大流经典构图神题的更多相关文章
- poj 1149 PIGS(最大流经典构图)
题目描述:迈克在一个养猪场工作,养猪场里有M 个猪圈,每个猪圈都上了锁.由于迈克没有钥匙,所以他不能打开任何一个猪圈.要买猪的顾客一个接一个来到养猪场,每个顾客有一些猪圈的钥匙,而且他们要买一定数量的 ...
- POJ1149 最大流经典建图PIG
题意: 有一个人,他有m个猪圈,每个猪圈里都有一定数量的猪,但是他没有钥匙,然后依次来了n个顾客,每个顾客都有一些钥匙,还有他要卖猪的数量,每个顾客来的时候主人用顾客的钥匙打开相应的门,可 ...
- JAVA经典算法40题及解答
JAVA经典算法40题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分 ...
- POJ 2484 A Funny Game(神题!)
一开始看这道博弈题的时候我就用很常规的思路去分析了,首先先手取1或者2个coin后都会使剩下的coin变成线性排列的长条,然后无论双方如何操作都是把该线条分解为若干个子线条而已,即分解为若干个子游戏而 ...
- BUAA 724 晴天小猪的神题(RMQ线段树)
BUAA 724 晴天小猪的神题 题意:中文题,略 题目链接:http://acm.buaa.edu.cn/problem/724/ 思路:对于询问x,y是否在同一区间,可以转换成有没有存在一个区间它 ...
- Bzoj 4408: [Fjoi 2016]神秘数 可持久化线段树,神题
4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 177 Solved: 128[Submit][Status ...
- UVA 674 Coin Change 换硬币 经典dp入门题
题意:有1,5,10,25,50五种硬币,给出一个数字,问又几种凑钱的方式能凑出这个数. 经典的dp题...可以递推也可以记忆化搜索... 我个人比较喜欢记忆化搜索,递推不是很熟练. 记忆化搜索:很白 ...
- JAVA经典算法40题
1: JAVA经典算法40题 2: [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 3 ...
- JAVA经典算法40题(原题+分析)之分析
JAVA经典算法40题(下) [程序1] 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: ...
随机推荐
- Bootstrap CSS概览
HTML5文档类型(<!DOCTYPE html>) Bootstrap前端框架使用了HTML5和CSS属性,为了让这些能正常工作,您需要使用HTML5文档类型(<!DOCTYPE ...
- 菜鸟学习Cocos2d-x 3.x——内存管理
菜鸟学习Cocos2d-x 3.x——内存管理 2014-12-10 分类:Cocos2d-x / 游戏开发 阅读(394) 评论(6) 亘古不变的东西 到现在,内存已经非常便宜,但是也不是可以 ...
- web前端常用的封装方法
1.放大镜 //页面加载完毕后执行 window.onload = function () { var oDemo = document.getElementById('demo'); var oMa ...
- 【php】 php-fpm 配置见解
来源:php官方文档 Init script setup=== You will probably want to create an init script for your new php-fpm ...
- '>>' should be '> >' within a nested template argument list
在编译关于opencv相机标定的工程的时候出现了这个问题 vector<vector<Point3f>> objectPoints; error: 'objectPoint ...
- PAT Basic 1052
1052 卖个萌 萌萌哒表情符号通常由“手”.“眼”.“口”三个主要部分组成.简单起见,我们假设一个表情符号是按下列格式输出的: [左手]([左眼][口][右眼])[右手] 现给出可选用的符号集合,请 ...
- 本机机器ssh docker容器
https://blog.csdn.net/u010324465/article/details/77184506 1.在docker中安装openssh-server 2.sudo /etc/ini ...
- CMDB资源配置管理项目
浅谈ITIL TIL即IT基础架构库(Information Technology Infrastructure Library, ITIL,信息技术基础架构库)由英国政府部门CCTA(Central ...
- 分离焦虑OR责任焦虑
这里是用小孩上幼儿园的事说分离焦虑,转念到成人身上就是责任焦虑. 这周小孩开始上幼儿园了,他很害怕家长离开,我能做的也不多,只是很肯定的告诉他,爸爸就在停车场,下学就来接你,然后从各个 ...
- 论文《Piexel Recurrent Nerual Network》总结
论文<Piexel Recurrent Nerual Network>总结 论文:<Pixel Recurrent Nerual Network> 时间:2016 作者:Aar ...