您的位置:首页 > 其它

最大匹配问题 POJ 1274

2016-03-10 23:17 309 查看
#include <iostream>

/*POJ 1274

奶牛和牛棚问题,N头奶牛和M个牛棚,每个牛棚只能有一头奶牛产奶

输入每头奶牛愿意产奶的牛棚数和对应的牛棚编号

输出最多分配到的牛棚数*/

const int maxnum =220;

int m,n,Edge[maxnum][maxnum];

int link[maxnum];

bool visited[maxnum];

int match[maxnum];

using namespace std;

bool dfs(int v){

    for(int i=1;i<=n;i++){

        if(Edge[v][i] !=0 && !visited[i]){

            visited[i] = true;

            if(link[i] == -1 || dfs(link[i])){

                link[i] = v;

                return true;

            }

        }

    }

    return false;

}

int findMaxMatch(){

    int res = 0;

    for(int i =1;i<maxnum;i++)

        link[i] = -1;

    for(int i=1;i<=m;i++){

        for(int j=1;j<maxnum;j++)

            visited[j] = 0;

        if(dfs(i))

            res++;

    }

    return res;

}

int main()

{

    int k,v;

    cin>>m>>n;

    for(int i=1;i<=maxnum;i++){

        for(int j=1;j<=maxnum;j++)

            Edge[i][j] =0;

    }

    for(int i=1;i<=m;i++){

        cin>>k;

        while(k--){

            cin>>v;

            Edge[i][v] =1;

        }

    }

    cout<<findMaxMatch()<<endl;

   /*下面可以找出最大匹配*/

    cout<<"最大匹配是:"<<endl;

    for(int i=1;i<maxnum;i++)

        match[i] =0;

    for(int i=1;i<maxnum;i++){

        if(link[i] != 0){

            match[link[i]] = i;

        }

    }

    for(int i=1;i<maxnum;i++){

        if(match[i]!=0){

            cout<<i<<"->"<<match[i]<<endl;

        }

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: