poj1149PIGS——网络最大流
题目:http://poj.org/problem?id=1149
不把猪圈当做点,而把顾客当作点,把猪当作边权(流量);
因为猪圈中的猪可流动,所以共用一个猪圈的人互相连边;
注意应该连成链的形式,来保证先后顺序。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
queue<int>q;
int m,n,s[],head[],ct=,cur[],hd[],inf=1e9,d[],ans;
bool sid[][];
struct N{
int to,next,w;
N(int t=,int n=,int ww=):to(t),next(n),w(ww) {}
}edge[];
bool in[];
void add(int x,int y,int z)
{
sid[x][y]=;sid[y][x]=;
edge[++ct]=N(y,head[x],z);head[x]=ct;
edge[++ct]=N(x,head[y],);head[y]=ct;
}
int fd(int x,int y)
{
for(int i=head[y];i;i=edge[i].next)//此处为有向边,所以应找y边集中连到x的边!
if(edge[i].to==x)return i;
return ;
}
bool bfs()
{
memset(d,,sizeof d);
while(q.size())q.pop();
d[]=;q.push();
while(q.size())
{
int x=q.front();q.pop();
for(int i=head[x];i;i=edge[i].next)
{
int u=edge[i].to;
if(!d[u]&&edge[i].w)
{
d[u]=d[x]+;
q.push(u);
}
}
}
return d[n+];
}
int dfs(int x,int f)
{
if(x==n+)return f;
int res=;
for(int i=cur[x];i;i=edge[i].next)
{
int u=edge[i].to;
if(d[u]==d[x]+&&edge[i].w)
{
int tmp=dfs(u,min(edge[i].w,f-res));
edge[i].w-=tmp;
edge[i^].w+=tmp;
res+=tmp;
if(edge[i].w)cur[x]=i;
if(res==f)return f;
}
}
if(!res)d[x]=;
return res;
}
int main()
{
scanf("%d%d",&m,&n);
for(int i=;i<=m;i++)
scanf("%d",&s[i]);
for(int i=;i<=n;i++)
{
int k,x;
scanf("%d",&k);
for(int j=;j<=k;j++)
{
scanf("%d",&x);
if(!hd[x]&&!in[i])hd[x]=i,in[i]=,add(,i,s[x]);
else if(!hd[x]&&in[i])
{
hd[x]=i;
int e=fd(i,);
edge[e].w+=s[x];
// edge[e^1].w-=s[x];//!!!
}
// if(!hd[x])hd[x]=i,add(0,i,s[x]);
if(hd[x])
{
if(!sid[hd[x]][i])//免重
add(hd[x],i,inf);
hd[x]=i;//!!!成链
}
}
scanf("%d",&x);
add(i,n+,x);
}
while(bfs())
{
for(int i=;i<=n+;i++)cur[i]=head[i];
ans+=dfs(,inf);
}
printf("%d",ans);
return ;
}
poj1149PIGS——网络最大流的更多相关文章
- P3376 【模板】网络最大流
P3376 [模板]网络最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点 ...
- HDU 3549 网络最大流再试
http://acm.hdu.edu.cn/showproblem.php?pid=3549 同样的网络最大流 T了好几次原因是用了cout,改成printf就A了 还有HDU oj的编译器也不支持以 ...
- 一般增广路方法求网络最大流(Ford-Fulkerson算法)
/* Time:2015-6-18 接触网络流好几天了 写的第一个模版————Ford-Fulkerson算法 作用:求解网络最大流 注意:源点是0 汇点是1 如果题目输入的是1到n 请预处理减1 * ...
- 算法模板——Dinic网络最大流 2
实现功能:同Dinic网络最大流 1 这个新的想法源于Dinic费用流算法... 在费用流算法里面,每次处理一条最短路,是通过spfa的过程中就记录下来,然后顺藤摸瓜处理一路 于是在这个里面我的最大流 ...
- 算法模板——Dinic网络最大流 1
实现功能:同sap网络最大流 今天第一次学Dinic,感觉最大的特点就是——相当的白话,相当的容易懂,而且丝毫不影响复杂度,顶多也就是代码长个几行 主要原理就是每次用spfa以O(n)的时间复杂度预处 ...
- 图论算法-网络最大流【EK;Dinic】
图论算法-网络最大流模板[EK;Dinic] EK模板 每次找出增广后残量网络中的最小残量增加流量 const int inf=1e9; int n,m,s,t; struct node{int v, ...
- 网络最大流算法—EK算法
前言 EK算法是求网络最大流的最基础的算法,也是比较好理解的一种算法,利用它可以解决绝大多数最大流问题. 但是受到时间复杂度的限制,这种算法常常有TLE的风险 思想 还记得我们在介绍最大流的时候提到的 ...
- 洛谷 P3376 【【模板】网络最大流】
题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行包含三个正整数ui. ...
- 洛谷P3376 【模板】网络最大流
题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...
随机推荐
- java代码评审内容
评审内容 u 工具检查 □ Eclipse警告 □ FindBug □ CheckStyle □ Jupiter □ Subclipse 或者Subversive u 代码注释内容(详细参考 ...
- HDFS源码分析心跳汇报之整体结构
我们知道,HDFS全称是Hadoop Distribute FileSystem,即Hadoop分布式文件系统.既然它是一个分布式文件系统,那么肯定存在很多物理节点,而这其中,就会有主从节点之分.在H ...
- 华为云测平台服务再升级!华为M5系列平板调测能力正式上线!
6月1日,华为M5系列平板设备兼容性测试和远程真机调试功能在华为终端开放实验室正式上线!助力您的产品在大屏适配上快人一步! 华为终端开放实验室DevEco平台现已提供基于华为M5系列平板设备的兼 ...
- erlang动态生成随机key
取随机数,举个例子: 获取动态随机key值16位(key的范围是由"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345678 ...
- android 在githup中的资源整理(转)
1.Github开源Android组件资源整理(一) 个性化控件(View) 2.Github开源Android组件资源整理(二)ActionBar和Menu 3. Github开源Android组件 ...
- js jquery 插件
$(function(){ (function($, document, undefiend){ $.fn.pagination = function(options){ var $this = $( ...
- 【BZOJ3721】PA2014 Final Bazarek 贪心
[BZOJ3721]PA2014 Final Bazarek Description 有n件商品,选出其中的k个,要求它们的总价为奇数,求最大可能的总价. Input 第一行一个整数n(1<=n ...
- 九度OJ 1079:手机键盘 (翻译)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2279 解决:1233 题目描述: 按照手机键盘输入字母的方式,计算所花费的时间 如:a,b,c都在"1"键上,输入a只 ...
- RocksDB
RocksDB RocksDB is a high performance[1][2][3][4][5] embedded database for key-value data. It is a f ...
- 使用cocos2d-js-3.0RC1中的物理引擎chipmunk模拟的“别碰钉子”源码分享(含碰撞检测)
分别用box2d和chipmunk实现了一下,不过box2d没整理,也懒得整理了.chipmunk整理了一下,分享给大家吧. 刚开始研究,抛砖引玉 简要说明:1.初始化物理环境,增加边界 initPh ...