poj 1149 PIG
来源:互联网 发布:json html 示例输出 编辑:程序博客网 时间:2024/06/06 09:29
建图才是王道,建完图就是裸最大流问题了
建图参考:
http://wenku.baidu.com/view/0ad00abec77da26925c5b01c.html
/*最大流问题*/
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
int c[105][105];
int a[105];
int flow[105][105];
int pre[105];
int pig[1005];
bool visit[1005];
int previsitor[1005];
int m,n;
const int inf = 100000000;
void init()
{
for(int i = 0;i<1005;i++)
{
previsitor[i] = 0;
visit[i] = false;
pig[i] = 0;
}
for(int i = 0;i<105;i++)
{
for(int j = 0;j<105;j++)
{
c[i][j] = 0;
flow[i][j] = 0;
}
a[i] = 0;
pre[i] =0;
}
}
int maxFlow()
{
int ans = 0;
queue<int>q;
while(1)
{
memset(a,0,sizeof(a));
q.push(0);
a[0] = inf;
while(!q.empty())
{
int temp = q.front();
q.pop();
for(int i = 1;i<=n+1;i++)
{
if(!a[i]&&c[temp][i]>flow[temp][i])
{
if(c[temp][i]-flow[temp][i]<a[temp])
{
a[i] = c[temp][i] - flow[temp][i];
}
else
a[i] = a[temp];
pre[i] = temp;
q.push(i);
}
}
}
if(a[n+1]==0)
break;
for(int i = n+1;i!=0;i=pre[i])
{
flow[pre[i]][i] += a[n+1];
flow[i][pre[i]] -= a[n+1];
}
ans+=a[n+1];
}
return ans;
}
int main()
{
while(scanf("%d %d",&m,&n)!=EOF)
{
init();
for(int i = 1;i<=m;i++)
{
scanf("%d",&pig[i]);
}
for(int i = 1;i<=n;i++)
{
int A,B,room;
scanf("%d",&A);
for(int j = 0;j<A;j++)
{
scanf("%d",&room);
if(!visit[room])
{
visit[room] = true;
c[0][i] += pig[room];
previsitor[room] = i;
}
else
{
c[previsitor[room]][i] = inf;
previsitor[room] = i;
}
}
scanf("%d",&B);
c[i][n+1] = B;
}
int ans = maxFlow();
printf("%d\n",ans);
}
return 0;
}
- poj 1149 PIG
- pig
- pig
- Pig
- Pig
- Pig
- Pig
- Pig
- pig
- 【pig】pig脚本规范
- plasma PIG
- 说说“pig”
- pig语言
- roast pig
- Pig实战
- Pig实战
- pig实战
- Pig实战
- 同一段C++在Linux和windows下编译后的可执行文件有什么不同?
- DFS&&BFS Search Graph
- 基于Tiny6410的LED驱动程序
- HDU4492:Mystery
- sample code about overloading new and delete
- poj 1149 PIG
- sscanf和sprintf使用
- 存储管理(一)
- 杭电1262
- python IDE比较与推荐
- find + grep 组合
- linux的 wget 命令
- POJ 1753 Flip Game
- 130506rman恢复测试,四种场景