您的位置:首页 > 其它

POJ 1274

2015-06-09 13:54 351 查看
#include<iostream>
#include<stdio.h>
#include <string.h>
#include <vector>
#define MAXN 251
#define _clr(x) memset(x,0xff,sizeof(int)*MAXN)
#define _clr(x) memset(x,0xff,sizeof(int)*MAXN)

using namespace std;

int hungary(int m,int n,int mat[][MAXN],int* match1,int* match2);
int _m[MAXN][MAXN];
int match1[MAXN];
int match2[MAXN];
int main()
{
//freopen("acm.acm","r",stdin);
int M;
int N;
int n;
int i;
int j;
//    bool M_N;
int s;
while(cin>>M>>N)
{
//    if(M <= N)
//        M_N = true;
for(i = 0; i < MAXN; ++i)
{
memset(_m[i],0,sizeof(int)*MAXN);
}
for(i = 0; i < M; ++ i)
{
cin>>s;
for(j = 0; j < s; ++ j)
{
cin>>n;
//            if(M_N)
//            {
_m[i][n-1] = 1;
//            }
//            else
//            {
//                _m[n-1][i] = 1;
//            }
}
}
//    if(M_N)
cout<<hungary(M,N,_m,match1,match2)<<endl;
//    else
//        cout<<hungary(N,M,_m,match1,match2)<<endl;
}
}

int hungary(int m,int n,int mat[][MAXN],int * match1,int* match2){
int s[MAXN],t[MAXN],p,q,ret=0,i,j,k;
for (_clr(match1),_clr(match2),i=0;i<m;ret+=(match1[i++]>=0))
for (_clr(t),s[p=q=0]=i;p<=q&&match1[i]<0;p++)
for (k=s[p],j=0;j<n&&match1[i]<0;j++)
if (mat[k][j]&&t[j]<0){
s[++q]=match2[j],t[j]=k;
if (s[q]<0)
for (p=j;p>=0;j=p)
match2[j]=k=t[j],p=match1[k],match1[k]=j;
}
return ret;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: