二分图最大匹配(HihoCoder

来源:互联网 发布:怎么查看淘宝店家电话 编辑:程序博客网 时间:2024/06/06 01:46

题目:
给你一个二分图,让你输出其最大匹配数.

输入
第1行:2个正整数,N,M(N表示点数 2≤N≤1,000,M表示边数1≤M≤5,000)
第2..M+1行:每行两个整数u,v,表示一条无向边(u,v)

输出
第1行:1个整数,表示最大匹配数

样例输入
5 4
3 2
1 3
5 4
1 5
样例输出
2

这道题如果把二分图想明白的话很简单的
还有就是vector的应用

#include <bits/stdc++.h>using namespace std;const int maxn=1e3+10;int pre[maxn];int used[maxn];vector<int>mp[maxn];int v,e;bool Find(int x){    int len=mp[x].size();   //这个表示mp[x]的个数    for(int i=0; i<len; i++)    {        int y=mp[x][i];        if(!used[y])        {            used[y]=1;            if( pre[y]==0 || Find(pre[y]))            {                pre[y]=x;                return true ;            }        }    }    return false ;   //如果mp的个数为0,那么就不存在这样的一个Find(x) }int main(){    while(cin>>v>>e)    {        int cnt=0;        for(int i=0; i<e; i++)        {            int a,b;            cin>>a>>b;            mp[a].push_back(b);   //因为是无向图,所以两边都要进行标记            mp[b].push_back(a);        }        memset(pre,0,sizeof(pre));        for(int i=1; i<=v; i++)        {            memset(used,0,sizeof(used));  //每进行一次查找,都要将used数组重置为0            if(Find(i))            {                cnt+=1;            }        }        cout<<cnt/2<<endl;  //因为前面for循环找的是所有顶点,也就是说二分图的左右的顶点都进行计算    }    return 0;}