计蒜客-二分匹配习题 男女分组

来源:互联网 发布:淘宝云客服兼职 编辑:程序博客网 时间:2024/09/21 08:58
蒜头君带领 nn 位同学前去郊游,其中有 mm 位是女生。出发前,蒜头君想给大家分个组,一位男生和一位女生分一组,相互照顾的同时还能促进男女生之间的友谊。但是每位同学可能会有若干个可以分在一组的选择,他只想和这几位同学分在一组,并不会选择其他同学。这可是给蒜头君出了一道难题,他想请聪明的你来帮他算算,最多可以分成多少个组。输入格式第一行输入两个正整数 m,n(1≤m,n≤100)。代表一共有 n 位同学,其中 m 位是女生。女生的编号为 1⋯m;男生的编号为 m+1 ⋯n。接下来输入若干行,每行输入两个正整数 a 和 b,表示编号为 a 的同学和编号为 b 的同学愿意和对方分在一组。如果 a 和 b 都为 -1,则表示输入结束。输出格式输出最佳分组方案。第一行输出最多能分的组数 SS。接下来输出 S 行,每行输出两个正整数 a 和 b,表示编号为 a 的同学和编号为 b 的同学分在一组。a 和 b 不分前后顺序,任意输出皆可。如果没有解,即不能分组,则输出No Solution!。本题答案不唯一,符合要求的答案均正确样例输入5 204 141 113 114 84 181 19-1 -1样例输出31 193 114 14
#include<bits/stdc++.h>using namespace std;int lkd[201][201],book[201],lk[201];int n,m,ans=0;bool dfs(int u){    for(int i=1;i<=m;i++)    {        if(lkd[u][i]&&!book[i])        {            book[i]=1;            if(lk[i]==0||dfs(lk[i]))            {                lk[i]=u;                return true;            }        }    }    return false;}int main(){    cin>>n>>m;          //m位是女生    if(n==1){ cout<<"No Solution!";return 0;}    int a,b;    cin>>a>>b;    while(a!=-1&&b!=-1){        lkd[a][b]=1;        cin>>a>>b;    }    for(int i=1;i<=m;i++)//lkd的第一维表示女生     {        memset(book,0,sizeof(book));        ans+=dfs(i);    }    cout<<ans<<endl;    for(int i=1;i<=m;i++)    {        if(lk[i]!=0)            cout<<lk[i]<<' '<<i<<endl;    }    return 0;}

//令人智熄 不输出无解也能过