poj 1274

poj 1274

没什么好说的,直接匈牙利算法

#include < iostream >  
using   namespace  std;
int  n,m; // n为x集合,m为y集合 
int  map[ 305 ][ 305 ]; // map[x][y]表示x,y两点之间有边相连 
bool  visit[ 305 ]; // 记录m中的i节点是否被访问过 
int  link[ 305 ]; // 记录当前n中的i节点是否与 j节点相连 
bool  dfs( int  a)
{
     
int  i;
     
for  (i = 1 ;i <= n;i ++ )
     {
         
if  (map[a][i] &&! visit[i])
         {
            visit[i]
= true ;
            
if  (link[i] == 0 || dfs(link[i]))
            {
               link[i]
= a;
               
return   true ;
            }
         }
     }
     
return   false ;
}
int  find()
{
     
int  sum = 0 ;
     
for  ( int  i = 1 ;i <= n;i ++ )
     {
         memset(visit,
0 , sizeof (visit));
         
if  (dfs(i))sum ++ ;
     }
     
return  sum; // 最大匹配数 
}
int  main()
{
    
int  t,i,j,k,x;
    
while  (scanf( " %d%d " , & n, & m) != EOF)
    {
          memset(map,
0 , sizeof (map));
          memset(link,
0 , sizeof (link));
          
for  (i = 1 ;i <= n;i ++ )
          {
              scanf(
" %d " , & j);
              
for  (k = 1 ;k <= j;k ++ )
              {
                  scanf(
" %d " , & x);
                  map[i][x]
= 1 ;
              }  
          }
          cout
<< find() << endl;
    }
return   0 ;
}

你可能感兴趣的:(poj 1274)