POJ 1149 PIGS
生活随笔
收集整理的這篇文章主要介紹了
POJ 1149 PIGS
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
POJ_1149
? ? 這個題目搞得我比較糾結,具體的思想還是看看這篇博客吧。
? ??http://imlazy.ycool.com/post.2059102.html
#include<stdio.h>#include<string.h>
#define MAXD 110
#define MAXM 30010
#define MAXm 1010
#define INF 10000000
int N, M, S, T, e, first[MAXD], work[MAXD], next[MAXM], v[MAXM], flow[MAXM], d[MAXD], q[MAXD];
int g[MAXD][MAXD], pre[MAXm], cow[MAXm];
void add(int x, int y, int z)
{
v[e] = y;
flow[e] = z;
next[e] = first[x];
first[x] = e;
e ++;
}
void init()
{
int i, j, k, n;
e = 0;
S = 0, T = N + 1;
memset(first, -1, sizeof(first));
memset(g, 0, sizeof(g));
memset(pre, 0, sizeof(pre));
for(i = 1; i <= M; i ++)
scanf("%d", &cow[i]);
for(i = 1; i <= N; i ++)
{
scanf("%d", &n);
for(j = 0; j < n; j ++)
{
scanf("%d", &k);
if(k > M)
continue;
if(!pre[k])
g[0][i] += cow[k];
else
g[pre[k]][i] = 1;
pre[k] = i;
}
scanf("%d", &k);
add(i, T, k);
add(T, i, 0);
}
for(i = 1; i <= N; i ++)
if(g[0][i])
{
add(0, i, g[0][i]);
add(i, 0, 0);
}
for(i = 1; i <= N; i ++)
for(j = i + 1; j <= N; j ++)
if(g[i][j])
{
add(i, j, INF);
add(j, i, 0);
}
}
int bfs()
{
int i, j, k, rear = 0;
memset(d, -1, sizeof(d));
d[S] = 0;
q[rear ++] = S;
for(i = 0; i < rear; i ++)
for(j = first[q[i]]; j != -1; j = next[j])
if(flow[j] > 0 && d[v[j]] == -1)
{
d[v[j]] = d[q[i]] + 1;
if(v[j] == T)
return 1;
q[rear ++] = v[j];
}
return 0;
}
int dfs(int cur, int a)
{
if(cur == T)
return a;
for(int &i = work[cur]; i != -1; i = next[i])
if(flow[i] > 0 && d[v[i]] == d[cur] + 1)
if(int t = dfs(v[i], a < flow[i] ? a : flow[i]))
{
flow[i] -= t;
flow[i ^ 1] += t;
return t;
}
return 0;
}
void solve()
{
int i, j, k, t, cnt = 0;
while(bfs())
{
memcpy(work, first, sizeof(first));
while(t = dfs(S, INF))
cnt += t;
}
printf("%d\n", cnt);
}
int main()
{
while(scanf("%d%d", &M, &N) == 2)
{
init();
solve();
}
return 0;
}
轉載于:https://www.cnblogs.com/staginner/archive/2012/01/17/2324239.html
總結
以上是生活随笔為你收集整理的POJ 1149 PIGS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 雅马哈宣布进军电动车模拟音效市场,踩电门
- 下一篇: 生产系统遇到的问题:producers