POJ 1149 网络流 合并建图
这个题目我敲了一个简单的EK,这不是难点
难点在于建图,按题目的要求 每个猪圈和顾客都建点的话,那也太多了。。。我看了Edelweiss里面的缩点方法才建好的图,哎,惭愧啊
实际那些猪圈根本不需要单独建点,猪圈无非就是向顾客输送流量 以及向同时开着的猪圈输送流量,这一步可以直接缩为,当某个猪圈被第一次打开,它里面的流量就全部输送给那个顾客那个点,而且可以叠加,因为每一次猪圈是可以互通的,而且猪圈本身是没有容量限制,如果有限制,那就还得再考虑。
此外,每次对猪圈的接下来的访问者都进行建边。用来输送之后的流量
处理好初始点和结束点。
#include <iostream>
#include <cstdio>
#include <cstring>
#define INF 1<<30
using namespace std;
int m,n;
int pigs[],cap[][],f[][],vis[][],buys;
int inq[],cnt[];
void init(){
memset(cap,,sizeof cap);
memset(f,,sizeof cap);
memset(vis,,sizeof vis);
memset(inq,,sizeof inq);
memset(cnt,,sizeof cnt);
}
int ans,q[],a[],p[];
void ek()
{
ans=;
const int M=;
for (;;){
memset(a,,sizeof a);
int head,rear;
head=rear=;
a[]=INF;
q[rear++]=;
while(head!=rear){
int u=q[head++];
if (head>=M) head%=M;
for (int v=;v<=n+;v++) if (!a[v] && cap[u][v]>f[u][v]){
p[v]=u;
q[rear++]=v;
if (rear>=M) rear%=M;
a[v]=min(a[u],cap[u][v]-f[u][v]);
}
}
if (a[n+]==) break;
for (int u=n+;u!=;u=p[u]){
f[p[u]][u]+=a[n+];
f[u][p[u]]-=a[n+];
}
ans+=a[n+];
}
} int main()
{
while (scanf("%d%d",&m,&n)!=EOF)
{
init();
int tmp,a;
for (int i=;i<=m;i++) scanf("%d",&pigs[i]);
for (int i=;i<=n;i++){
scanf("%d",&tmp);
for (int j=;j<tmp;j++){
scanf("%d",&a);
vis[a][cnt[a]++]=i;
if (inq[a]) continue;
inq[a]=;
cap[][i]+=pigs[a];
}
scanf("%d",&buys);
cap[i][n+]=buys;
}
for (int i=;i<=m;i++){
for (int j=;j<cnt[i]-;j++){
int a=vis[i][j];
int b=vis[i][j+];
cap[a][b]=INF;
}
}
}
ek();
printf("%d\n",ans);
}
return ;
}
POJ 1149 网络流 合并建图的更多相关文章
- POJ - 1149 PIGS (建图思维+最大流)
(点击查看原题) 题目分析 (以下均为 Edelweiss 大佬的思路,博主承认自己写不了这么好,但是学习的心促使我记录下这个好题的写法,所以代码是我写的) [题目大意] 有 M 个猪圈,每个猪圈里初 ...
- PIGS POJ - 1149网络流(最短增广路---广搜) + 建图
题意: 第一行输入m和n,m是猪圈的数量,n是顾客的数量,下面n行 第 i+1行表示第i个顾客 , 输入第一个数字表示有几把猪圈的钥匙,后面输入对应的猪圈,最后一个数字输入顾客想买几头猪. 建图: 设 ...
- POJ 1637 Sightseeing tour 建图+网络流
题意: 给定一个混合图,所谓混合图就是图中既有单向边也有双向边,现在求这样的图是否存在欧拉回路. 分析: 存在欧拉回路的有向图,必须满足[入度==出度],现在,有些边已经被定向,所以我们直接记录度数即 ...
- poj 3281 最大流+建图
很巧妙的思想 转自:http://www.cnblogs.com/kuangbin/archive/2012/08/21/2649850.html 本题能够想到用最大流做,那真的是太绝了.建模的方法很 ...
- poj 3281 最大流建图
题目链接:http://poj.org/problem?id=3281 #include <cstdio> #include <cmath> #include <algo ...
- [poj 3281]最大流+建图很巧妙
题目链接:http://poj.org/problem?id=3281 看了kuangbin大佬的思路,还用着kuangbin板子orz http://www.cnblogs.com/kuangb ...
- POJ 1161 Walls ( Floyd && 建图 )
题意 : 在某国,城市之间建起了长城,每一条长城连接两座城市.每条长城互不相交.因此,从一个区域到另一个区域,需要经过一些城镇或者穿过一些长城.任意两个城市A和B之间最多只有一条长城,一端在A城市, ...
- POJ 2226 缩点建图+二分图最大匹配
这个最小覆盖但不同于 POJ 3041,只有横或者竖方向连通的点能用一块板子覆盖,非连续的,就要用多块 所以用类似并查集方法,分别横向与竖向缩点,有交集的地方就连通,再走一遍最大匹配即可 一开始还有点 ...
- POJ 2374 线段树建图+Dijkstra
题意: 思路: 线段树+Dijkstra(要堆优化的) 线段树要支持打标记 一个栅栏 拆成两个点 :左和右 新加一个栅栏的时候 看看左端点有没有被覆盖过 如果有的话 就分别从覆盖的那条线段的左右向当前 ...
随机推荐
- rapid-generator JAVA代码生成器
有感于马上要做个比较大的业务系统,想到那无止境的增删改查.粘贴复制,顿时脑后升起一阵凉风.于是想到个找或者写一个Java代码的生成器,这样在正常开发进度下,也能余下更多的时间去做些别的事情. 闲话少说 ...
- 使用Spring JMS轻松实现异步消息传递
异步进程通信是面向服务架构(SOA)一个重要的组成部分,因为企业里很多系统通信,特别是与外部组织间的通信,实质上都是异步的.Java消息服务(JMS)是用于编写使用异步消息传递的JEE应用程序的API ...
- hibernate部分源码解析and解决工作上关于hibernate的一个问题例子(包含oracle中新建表为何列名全转为大写且通过hibernate取数时如何不用再次遍历将列名(key)值转为小写)
最近在研究系统启动时将数据加载到内存非常耗时,想着是否有办法优化!经过日志打印测试发现查询时间(查询时间:将数据库数据查询到系统中并转为List<Map>或List<*.Class& ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 辅助类:清除浮动1
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 数据结构 c++ 广义表
// CTest.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include &l ...
- u盘使用记录、痕迹删除技巧方法
在日常生活的使用U盘过程当中,系统会记录下大量U盘的使用记录信息,那么接下来小编就来同大家分享介绍如何删除掉这些使用记录的方法知识. 1. 往系统里面添加环境变量devmgr_shownonprese ...
- 获取控件的xy坐标
procedure TForm1.SpeedButton1Click(Sender: TObject); var Apoint:TPoint; begin APoint:=TSpeedButt ...
- 安卓fragment transaction add方法报错
这个问题百度了很多能用的很少! 原来看的B站的视频教程比较老了参数不匹配!我记一下安卓studio3.1的方法 切换fragment 前都先要 FragmentManager manager=getS ...
- 关于可持久化Trie
我认为 可持久化Trie 主要指 可持久化01Trie 如洛谷P4735 将每个数的异或前缀和转化为二进制,添加前缀0至相同位数,然后从最高位开始插入,类似主席树,每一层都对需要更新的点加入一个新的点 ...
- Linux系统下的/etc/nsswitch.conf文件
一.什么是nsswithch.conf(服务搜索顺序)文件呢? nsswitch.conf(name service switch configuration,名字服务切换配置)文件位于/etc目录下 ...