1,一般增广路算法 采取标号法每次在容量网络中寻找一条增广路进行增广,
直至不存在增广路为止。
增广路方法 2,最短增广路算法 每个阶段:在层次网络中,不断用BFS算法进行增广直到
不存在增广路为止。如果汇点不在层次网络中,则算法中
止。
3,连续最短增广路算法 在最短增广路算法的基础上改造:在每个阶段,用
一个DFS过程实现多次增广。如果汇点不在层次网络
直至不存在增广路为止。
增广路方法 2,最短增广路算法 每个阶段:在层次网络中,不断用BFS算法进行增广直到
不存在增广路为止。如果汇点不在层次网络中,则算法中
止。
3,连续最短增广路算法 在最短增广路算法的基础上改造:在每个阶段,用
一个DFS过程实现多次增广。如果汇点不在层次网络
中,则算法结束。
poj 1149 PIGS
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include "memory.h"
using namespace std;
#define M 1010 //pighouse
#define N 110 //person
#define INF 0x6ffffff
struct Node
{
int to;
int next;
int c;
}node[M * N];
int pos = 0;
int head[N];
int pre[M];
int pigHouseNum,personNum;
int pigNum[M];
void Init()
{
pos = 0; memset(head,-1,sizeof(head));
memset(pre,0,sizeof(pre));
}
void Insert(int u,int v,int c)
{
node[pos].to = v; node[pos].c = c; node[pos].next = head[u]; head[u] = pos; pos++;
}
int level[M + N],que[M + N];
bool BFS()
{
memset(level,0,sizeof(level));
int front = 0;
int back = 0;
que[back] = 0; back++;
level[0] = 1;
while (front < back)
{
int u = que[front];
front++;
if (u == personNum + 1)
return true;
for (int i = head[u]; i != -1; i = node[i].next)
{
int v = node[i].to;
int c = node[i].c;
if (c && !level[v])
{
level[v] = level[u] + 1;
que[back] = v; back++;
}
}
}
return false;
}
int DFS(int u,int sum)
{
if (u == personNum + 1 || sum == 0)
return sum;
int ans = 0;
for (int i = head[u]; i != -1; i = node[i].next)
{
int v = node[i].to;
int c = node[i].c;
if (c && level[v] == level[u] + 1)
{
int t = DFS(v,min(c,sum - ans));
if (t == 0)
{
level[v] = 0;
continue;
}
node[i].c -= t;
node[i^1].c +=t;
ans += t;
}
}
return ans;
}
int Dinic()
{
int res = 0;
while (BFS())
res += DFS(0,INF);
return res;
}
int main()
{
Init();
scanf("%d%d",&pigHouseNum,&personNum);
for (int i = 1; i <= pigHouseNum; i++)
scanf("%d",&pigNum[i]);
for (int i = 1; i <= personNum; i++)
{
int n,temp;
scanf("%d",&n);
while (n--)
{
scanf("%d",&temp);
if (pre[temp] == 0)
{
Insert(0,i,pigNum[temp]);
Insert(i,0,0);
pre[temp] = i;
}
else
{
Insert(pre[temp],i,INF);
Insert(i,pre[temp],0);
pre[temp] = i;
}
}
scanf("%d",&temp);
Insert(i,personNum + 1,temp);
Insert(personNum + 1,i,0);
}
int num = Dinic();
printf("%d\n",num);
return 0;
}