二分图匹配

使用了匈牙利算法(就是暴力)

具体思路还是友链吧

这是大佬

这是我基佬然而他是一位htlm选手。所以看他的blog会很卡

我就是想解释一下vis数组的意义~~可能有纰漏o( ̄▽ ̄)d ~~

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
int read()
{
    int s=0;
    char in=getchar();
    while(in<'0'||in>'9')
		in=getchar();
    while(in>='0'&&in<='9')
	{
        s=(s<<3)+(s<<1)+in-'0';
        in=getchar();
    }
    return s;
}
//bool map[1010][1010];//用的是邻接表
vector<int>rel[1010];
int pat[1010];
bool vis[1010];
int n,m,e;
bool dfs(int x)
{
	for(int i=0;i<rel[x].size();i++)
	if(!vis[rel[x][i]])//如果他没有被尝试匹配
	{
		vis[rel[x][i]]=true;//已尝试匹配,为什么这里一定要被变为true呢?
                //如果这个点可以霸占他,一定是要被标记的。如果不能的话。说明这个点已经名花有主了,所以也要被标记
		if(!pat[rel[x][i]]||dfs(pat[rel[x][i]]))
		{
			pat[rel[x][i]]=x;
			return true;
		}
	}
	return false;
}
int main()
{
	n=read();
	m=read();
	e=read();
	int a,b;
	for(int i=1;i<=e;i++)
	{
		a=read();
		b=read();
		if(a<=n&&b<=m)
			//map[a][b]=true;
			rel[a].push_back(b);
	}
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		memset(vis,false,sizeof(vis));
		if(dfs(i))
			ans+=1;
	}
	printf("%d",ans);
}
posted @ 2018-04-15 08:28  Lance1ot  阅读(123)  评论(0编辑  收藏  举报