5 5 2 2 5 3 2 3 4 2 1 5 3 1 2 5 1 2
4
網絡流或者二分匹配。
題意: 有n頭牛 m個攤位 每個攤位只能容納一頭奶牛 每頭牛都有自己願意產奶的攤位 問最多有幾頭牛能在願意的攤位產奶
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define MAXN 44444
#define MAXM 999999
#define inf 1<<30
struct Edge
{
int v,cap,next;
} edge[MAXM];
int n,m,vs,vt,NE,NV;
int head[MAXN];
void Insert(int u,int v,int cap)
{
edge[NE].v=v;
edge[NE].cap=cap;
edge[NE].next=head[u];
head[u]=NE++;
edge[NE].v=u;
edge[NE].cap=0;
edge[NE].next=head[v];
head[v]=NE++;
}
int level[MAXN];
int gap[MAXN];
void bfs(int vt)
{
memset(level,-1,sizeof(level));
memset(gap,0,sizeof(gap));
level[vt]=0;
gap[level[vt]]++;
queue<int>que;
que.push(vt);
while(!que.empty())
{
int u=que.front();
que.pop();
for(int i=head[u]; i!=-1; i=edge[i].next)
{
int v=edge[i].v;
if(level[v]!=-1)continue;
level[v]=level[u]+1;
gap[level[v]]++;
que.push(v);
}
}
}
int pre[MAXN];
int cur[MAXN];
//參數 起點 終點
int SAP(int vs,int vt)
{
bfs(vt);
memset(pre,-1,sizeof(pre));
memcpy(cur,head,sizeof(head));
int u=pre[vs]=vs,flow=0,aug=inf;
gap[0]=NV;
while(level[vs]<nv) .cap-="aug;" aug="(aug==-1?edge[i].cap:min(aug,edge[i].cap));" bool="" flag="false;" i="edge[i].next)" int="" j="0;j<u;j++)" minlevel="NV;" ne="0;" nv="n+m+1;//可能走過的邊的總數" pre="" return="" u="pre[v];" v="=vt)" vs="0;//起點" vt="n+m+1;//終點"><p>
</p>
</nv)></int></queue></algorithm></cstring></cstdio></iostream>