poj 1149 建图+最大流
来源:互联网 发布:2015最流行的网络歌曲 编辑:程序博客网 时间:2024/06/06 08:56
此题关键问题在于顾客是一个接一个来的,所以早来的顾客选择权越大。
下面是建图
1、首先将所有顾客和汇点连接,边容量就是顾客需要的猪的数量。这是很容易想到的。
2、然后,对于某个猪圈,最先来的人能最先访问它,所以猪圈(源)优先连接先来的人,边容量为猪圈里猪的数目,如果当前猪圈已经被访问过,那么就让上一次访问这个猪圈的顾客和当前顾客连接。
上图的最大流就是答案。
可以这样想象,猪优先给,先打开它的人,晚来的人只能拿上一个人剩下来的(因为上一个人拿完他的那一份,流量就流向了汇点)。
#include<cstdio>#include<cstring>#include<cmath>#include<iostream>#include<algorithm>#include<set>#include<map>#include<queue>#include<vector>#include<string>#define eps 1e-12#define INF 0x7fffffff#define maxn 1500using namespace std;int n,m;int en;int st,ed;//源点和汇点int dis[maxn] ;//dis[i],表示 到 原点 s 的 层数int que[9999999];struct edge{int to,c,next;};edge e[9999999];int head[maxn];void add(int a,int b,int c){e[en].to=b;e[en].c=c;e[en].next=head[a];head[a]=en++;e[en].to=a;e[en].c=0;e[en].next=head[b];head[b]=en++;}int bfs(){ memset(dis,-1,sizeof(dis)); dis[st]=0; int front=0,rear=0; que[rear++]=st; while(front<rear) { int j=que[front++]; for(int k=head[j];k!=-1;k=e[k].next) { int i=e[k].to;if(dis[i]==-1&&e[k].c) { dis[i] = dis[j]+ 1 ; que[rear++]=i; if(i==ed) return true; } } } return false;}int dfs(int x,int mx){ int i,a; if(x==ed) return mx ; int ret=0; for(int k=head[x];k!=-1&&ret<mx;k=e[k].next) { if(e[k].c&&dis[e[k].to]==dis[x]+1) { int dd=dfs(e[k].to,min(e[k].c,mx)); e[k].c-=dd; e[k^1].c+=dd; mx-=dd; ret+=dd; } } if(!ret) dis[x]=-1; return ret;}void init(){ en=0;st=n+m+1; //源 ed=n+m+2; //汇memset(head,-1,sizeof(head));}int key[maxn],pig[maxn];int v[maxn];int c[400][400];void build(){ int x,y; memset(c,0,sizeof(c)); memset(v,0,sizeof(v)); for(int i=1;i<=m;i++) { scanf("%d",&pig[i]); } for(int i=1;i<=n;i++) { scanf("%d",&x); for(int j=1;j<=x;j++) { scanf("%d",&key[j]); if(!v[key[j]]) { v[key[j]]=i; add(st,i,pig[key[j]]); } else { add(v[key[j]],i,INF); v[key[j]]=i; } } scanf("%d",&y); add(i,ed,y); }}int dinic(){ int tmp=0; int maxflow=0; while(bfs()) { while(tmp=dfs(st,INF)) maxflow+=tmp; } return maxflow;}int main(){ while(scanf("%d%d",&m,&n)!=EOF) { init(); build(); printf("%d\n",dinic()); }}
4 0
- poj 1149 建图+最大流
- POJ 1149 最大流
- POJ 1149 PIGS(最大流+建图)
- [POJ 1149]PIGS[最大流][建图]
- Poj 1149 PIGS【最大流Dinic+建图】
- POJ 3281 最大流+建图
- 【POJ 1149】 Pigs 最大流
- poj 1149(最大流)
- [最大流] poj 1149 pigs
- POJ 1149 最大流 PIGS
- POJ 1149 PIGS (最大流)
- POJ 1149 PIGS 最大流
- poj 1149 PIGS 最大流
- POJ 1149 PIGS(最大流)
- POJ 1149 PIGS ,最大流
- 【最大流】POJ-1149 PIGS
- poj 1149 PIGS 最大流
- PIGS (poj 1149 最大流)
- spring http invoker 实践
- 给文档加密,你懂多少?
- shell/终端
- Display 开发的经验分享
- Ubuntu下安装可视化SVN客户端Rabbitvcs
- poj 1149 建图+最大流
- 虚拟存储器
- A summary of the first semester
- 有一种黑客叫做工具党
- Memcached 解析二
- 《Start Developing iOS Apps Today》学习笔记(二)应用实现过程
- 取石子游戏 (经典博弈论)
- hdu_3819 A and B Problem (字符串)
- Memcached 解析三