本质:利用增广路进行最大二分图匹配
代码实现:链式前向星+匈牙利算法
//链式前向星+匈牙利算法
#include
using namespace std;
const int maxn=150;
const int maxm=150;
struct edge{
int end;
int next;
};
edge edges[maxm];
int n,m,eid,p[maxm],match[maxn];
bool vis[maxn];
void insert(int u,int v)
{
edges[eid].end=v;
edges[eid].next=p[u];
p[u]=eid++;
}
int dfs(int u)
{
for(int i=p[u];i!=-1;i=edges[i].next){
int v=edges[i].end;
if(!vis[v]){
vis[v]=true;
if(!match[v]||dfs(match[v])){
match[v]=u;
return true;
}
}
}
return false;
}
int main()
{
scanf("%d%d",&n,&m);
int a,b;
for(int i=1;i<=m;i++){
scanf("%d%d",&a,&b);
insert(a,b);
}
int ans=0;
for(int i=1;i<=n;i++){
memset(vis,false,sizeof(vis));
if(dfs(i)){
ans++;
}
}
printf("%d\n",ans);
return 0;
}
附上白书代码:
#include
using namespace std;
const int MAX_V=100;
int V;
vectorG[MAX_V];
int match[MAX_V];
bool used[MAX_V];
void add_edge(int u,int v)
{
G[u].push_back(v);
G[v].push_back(u);
}
bool dfs(int v)
{
used[v]=true;
for(int i=0;i