有
题解
一道有趣的网络流建模题……
首先当然要建超源(
把每个顾客都看成一个点。
每个顾客向
首先是
如果某个顾客打开了猪圈
建图代码如下:
cpp
inline int solve()
{
memset(first, 0xff, sizeof(first));
scanf("%d%d", &m, &n);
for(int i = 1; i <= m; ++i)
scanf("%d", &yuan[i]); // 原来猪圈里的猪
for(int i = 1; i <= n; ++i)
{
int tn;
scanf("%d", &tn);
for(int j = 1, x; j <= tn; ++j)
{
scanf("%d", &x);
mmap[lst[x]][i] = lst[x] ? inf : mmap[lst[x]][i] + yuan[x]; // lst数组一开始是0
lst[x] = i; // 最近那次打开猪圈的人是i
}
scanf("%d", &tn);
add_edge(i, n + 1, tn); // 向最后的
}
for(int i = 0; i <= n; ++i)
for(int j = 0; j <= n; ++j)
if(mmap[i][j])
add_edge(i, j, mmap[i][j]); // 由于可能有重边所以先用邻接矩阵暂存一下,然后统一加入
for(register int i = 0; i <= n + 1; ++i)
first_bak[i] = first[i]; // dinic当前弧优化是用,不用理他
return Dinic();
}