poj1274

来源:互联网 发布:拉塞尔夏季联赛数据 编辑:程序博客网 时间:2024/05/17 01:01
#include <iostream>#include<cstdio>#include<algorithm>#include<vector>#include<cstring>using namespace std;int n,m,match[500],v;bool used[500];vector<int> g[500];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<g[v].size();i++)    {        int w=match[g[v][i]];        if(w<0||!used[w]&&dfs(w))        {            match[g[v][i]]=v;            match[v]=g[v][i];            return true;        }    }    return false;}int matching(){    int ans=0;    memset(match,-1,sizeof(match));    for(int i=0;i<v;i++)    {        if(match[i]<0)        {            memset(used,0,sizeof(used));            if(dfs(i))            {                ans++;            }        }    }    return ans;}int main(){    while(cin>>n>>m)    {        v=n+m;        for(int i=0;i<=v;i++)            g[i].clear();        for(int i=0;i<n;i++)        {            int num;            scanf("%d",&num);            while(num--)            {                int k;                scanf("%d",&k);                k=k+n-1;                add_edge(k,i);            }        }        printf("%d\n",matching());    }    return 0;}
本题为二分图问题,题意比较直白,适合初学者练习
0 0
原创粉丝点击