POJ 1149 网络流 合并建图

这个题目我敲了一个简单的EK,这不是难点

难点在于建图,按题目的要求 每个猪圈和顾客都建点的话,那也太多了。。。我看了Edelweiss里面的缩点方法才建好的图,哎,惭愧啊

实际那些猪圈根本不需要单独建点,猪圈无非就是向顾客输送流量
以及向同时开着的猪圈输送流量,这一步可以直接缩为,当某个猪圈被第一次打开,它里面的流量就全部输送给那个顾客那个点,而且可以叠加,因为每一次猪圈是可以互通的,而且猪圈本身是没有容量限制,如果有限制,那就还得再考虑。

此外,每次对猪圈的接下来的访问者都进行建边。用来输送之后的流量

处理好初始点和结束点。


#include <iostream>
#include <cstdio>
#include <cstring>
#define INF 1<<30
using namespace std;
int m,n;
int pigs[1010],cap[110][110],f[110][110],vis[1010][110],buys;
int inq[1010],cnt[1010];
void init(){
memset(cap,0,sizeof cap);
memset(f,0,sizeof cap);
memset(vis,0,sizeof vis);
memset(inq,0,sizeof inq);
memset(cnt,0,sizeof cnt);
}
int ans,q[110],a[110],p[110];
void ek()
{
ans=0;
const int M=105;
for (;;){
memset(a,0,sizeof a);
int head,rear;
head=rear=0;
a[0]=INF;
q[rear++]=0;
while(head!=rear){
int u=q[head++];
if (head>=M) head%=M;
for (int v=0;v<=n+1;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+1]==0) break;
for (int u=n+1;u!=0;u=p[u]){
f[p[u]][u]+=a[n+1];
f[u][p[u]]-=a[n+1];
}
ans+=a[n+1];
}
}

int main()
{
while (scanf("%d%d",&m,&n)!=EOF)
{
init();
int tmp,a;
for (int i=1;i<=m;i++) scanf("%d",&pigs[i]);
for (int i=1;i<=n;i++){
scanf("%d",&tmp);
for (int j=0;j<tmp;j++){
scanf("%d",&a);
vis[a][cnt[a]++]=i;
if (inq[a]) continue;
inq[a]=1;
cap[0][i]+=pigs[a];
}
scanf("%d",&buys);
cap[i][n+1]=buys;
}
for (int i=1;i<=m;i++){
for (int j=0;j<cnt[i]-1;j++){
int a=vis[i][j];
int b=vis[i][j+1];
cap[a][b]=INF;
}
}
}
ek();
printf("%d\n",ans);
}
return 0;
}

POJ 1149 网络流 合并建图,布布扣,bubuko.com

时间: 2024-08-25 22:30:20

POJ 1149 网络流 合并建图的相关文章

POJ 2226 缩点建图+二分图最大匹配

这个最小覆盖但不同于 POJ 3041,只有横或者竖方向连通的点能用一块板子覆盖,非连续的,就要用多块 所以用类似并查集方法,分别横向与竖向缩点,有交集的地方就连通,再走一遍最大匹配即可 一开始还有点没想清楚缩点怎么写,其实就是横向和竖向分别缩一下,不要混在一起,否则很麻烦,要注意一下 #include <iostream> #include <cstdio> #include <cstring> using namespace std; char mat[900][9

poj 3281 最大流+建图

很巧妙的思想 转自:http://www.cnblogs.com/kuangbin/archive/2012/08/21/2649850.html 本题能够想到用最大流做,那真的是太绝了.建模的方法很妙! 题意就是有N头牛,F个食物,D个饮料. N头牛每头牛有一定的喜好,只喜欢几个食物和饮料. 每个食物和饮料只能给一头牛.一头牛只能得到一个食物和饮料. 而且一头牛必须同时获得一个食物和一个饮料才能满足.问至多有多少头牛可以获得满足. 最初相当的是二分匹配.但是明显不行,因为要分配两个东西,两个东

The K-League (网络流,建图难)

The K-League 题目: 给出N给人,两两之间进行比赛.现在已经确定第i个人赢得场数和输的场数,让你通过其与N-1个之间在进行比赛他是否有可能赢得冠军. 算法: 可以知道要让第i个人获得冠军那个其与n-1人的比赛他要都赢.既,他能赢得最大场数为win[i] + a[i][j].如果,这个总的场数都大不了别人的已经确定赢得场数那么其肯定获得不了冠军,是吧?.而对与一场比赛只有两种结果,要么i赢要么j赢.这时候我们就可以想到了如何建图,即把某两个人在某一场比赛分别当作一个节点.这里有显然的对

POJ 1161 Walls ( Floyd &amp;&amp; 建图 )

题意 :  在某国,城市之间建起了长城,每一条长城连接两座城市.每条长城互不相交.因此,从一个区域到另一个区域,需要经过一些城镇或者穿过一些长城.任意两个城市A和B之间最多只有一条长城,一端在A城市,另一端在B城市.从A走到B,可以只在一个区域内行走,或者只在长城上行走. 有一个俱乐部,它的会员分布在不同的城市中,每个城市要么只有一个会员,要么没有会员.会员们决定要集中到一个区域内聚会.他们骑车前往目的地.首先,由于城市内交通太堵,他们不想进入任何一个城市内,其次,他们希望穿越尽可能少的长城.他

UVA 11765 Component Placement 网络流 新姿势建图

题目链接:点击打开链接 题意: 给定n个物品, m个约束条件 把n个物品分到2个集合里 下面第一行表示i物品分到第一个集合里的花费 第二行表示分到第二个集合里的花费 第三行表示分物品的限制(1表示只能分到第一个集合,-1表示只能分到第二个集合,0无限制) 下面m行给出约束条件 u v cost 表示u v 两点必须能互相沟通,若两点已经在同一集合则花费为0 ,若不在同一集合则花费增加cost 问满足m个约束条件下的最小花费 思路: 首先感觉是网络流,==建图比较难想 用流量表示费用 1.若i点放

网络流建图/模型总结

网络流真的是一个什么强大的算法啦.令人头疼的是网络流的灵活应用之广泛,网络流的题目建图方式也是千奇百怪,所以蒟蒻打算总结一下网络流的建图方式.秉着不重复造轮子的原则(其实是博主又菜又想找个借口),网上大佬写的好的就直接贴网址了. (更新ing) 大佬强无敌的总结:https://www.cnblogs.com/victorique/p/8560656.html#autoid-1-10-3 最小割应用:https://wenku.baidu.com/view/87ecda38376baf1ffc4

POJ 1149 PIGS (网络最大流 Dinic 建对图你就赢了)

PIGS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 17598   Accepted: 7977 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 t

POJ 1149 PIGS(最大流+建图)

题目链接:http://poj.org/problem?id=1149 题意:M个猪圈,N个顾客,每个顾客有一些的猪圈的钥匙,只能购买能打开的猪圈里的猪,而且要买一定数量的猪,每个猪圈有已知数量的猪, 但是猪圈可以重新打开,将猪的个数,重新分配,但是只能将猪往当前打开状态的猪圈里赶,以达到卖出的猪的数量最多. 思路:还是4部分,源点->猪圈->猪圈->汇点 Accepted 976K 63MS C++ 能用EK水的,当然用EK水 #include <iostream> #in

POJ 3281 Dining (网络流最大流 拆点建图 Edmonds-Karp算法)

Dining Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10159   Accepted: 4676 Description Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she will consume no others. Farmer John has cooked fabulo