额,大一暑假写的匈牙利算法,还是比较干净的,翻出来存起来以后备用。
匈牙利算法,用来解决二分匹配的最大匹配问题~
#include"cstdio"
#include"cstring"
#include"vector"
using namespace std;
#define inf 99999
int n,m; //点,边
int res; //匹配数
int ans[inf]; //各点对应妻子,or -1
int book[inf]; //交替路标记
vector<int>edge[inf];
int dfs(int u)
{
int len=edge[u].size();
for(int i=0;i<len;i++)
{
int v=edge[u][i];
if(!book[v])
{
book[v]=1;
if(ans[v]==-1||dfs(ans[v]))
{
ans[v]=u;
ans[u]=v;
return 1;
}
}
}
return 0;
}
int XYL()
{
int i,j;
for(i=0;i<n;i++)
{
if(ans[i]==-1)
{
memset(book,0,sizeof book);
res+=dfs(i);
}
}
return res;
}
void init()
{
for(int i=0;i<n;i++){edge[i].clear();ans[i]=-1;}
res=0;
}
int main()
{
int i,j;
scanf("%d%d",&n,&m);
init();
while(m--)
{
int x,y;
scanf("%d%d",&x,&y);
edge[x].push_back(y);
edge[y].push_back(x);
}
printf("%d\n",XYL());
return 0;
}