我希望你是我独家记忆

一段永远封存的记忆,随风而去
posts - 263, comments - 31, trackbacks - 0, articles - 3
   :: 首页 :: 新随笔 ::  :: 聚合  :: 管理

ZJU--1140--二部图

Posted on 2008-08-01 19:39 Hero 阅读(163) 评论(0)  编辑 收藏 引用 所属分类: 代码如诗--ACM
/* Accepted 1140 C++ 00:01.10 500K */
//还是二部图

#include 
<stdio.h>
#include 
<stdlib.h>
#include 
<string.h>
#include 
<ctype.h>
#define llong unsigned long long 
#define unint unsigned int
#define printline  printf( "\n" ) 

const int INF = 1000000 ;
const int size = 310 ;

int testnum, ct ;
int inp, inn ;
bool link[size][size] ;

int Binmatch( int inn, int inm )
{
    
int matchnum = 0 ; int dn_node ;
    
int queue[size*10] ; int head=0, tail = 0 ;//定义队列
    int upmatch[size], dnmatch[size] ; int prev[size] ;
    memset( upmatch, 
-1sizeof(upmatch) ) ;
    memset( dnmatch, 
-1sizeof(dnmatch) ) ;

    
forint i=1; i<=inn; i++ ) {
        
forint j=1; j<=inm; j++ )    prev[j] = -2 ;
        head 
= tail = 0 ;

        
forint j=1; j<=inm; j++ )    if( link[i][j] )
        { prev[j] 
= -1 ; queue[tail++= j ; }

        
while( head < tail ) {
            dn_node 
= queue[head] ;
            
if-1 == dnmatch[dn_node] )    break ;
            head
++ ;
            
forint j=1; j<=inm; j++ ) if-2==prev[j]&&link[dnmatch[dn_node]][j] )
            { prev[j] 
= dn_node ; queue[tail++= j ; }
        }

        
if( head == tail )    continue ;
        
while( prev[dn_node] > -1 ) {
            upmatch[dnmatch[prev[dn_node]]] 
= dn_node ;
            dnmatch[dn_node] 
= dnmatch[prev[dn_node]] ;
            dn_node 
= prev[dn_node] ;
        }

        dnmatch[dn_node] 
= i ; upmatch[i] = dn_node ;
        matchnum
++ ;
    }

    
return matchnum ;
}

int main()
{
    
//freopen( "frac1.in", "r", stdin ) ;
    
//freopen( "frac1.out","w",stdout ) ;

    
int sn, en, numlink ;
    
while( scanf( "%d",&testnum ) != EOF )
    {
        
for( ct=1; ct<=testnum; ct++ ) 
        {
            memset( link, 
falsesizeof(link) ) ;
            scanf( 
"%d %d",&inp, &inn ) ;
            
forint sn=1; sn<=inp; sn++ ) {
                scanf( 
"%d",&numlink ) ;
                
while( numlink -- ) {
                    scanf( 
"%d",&en ) ;    link[sn][en] = true ;
                }
            }
//data input

            
int matchnum = Binmatch( inp, inn ) ;

            
if( matchnum == inp )    printf( "YES\n" ) ;
            
else                    printf( "NO\n" )  ;
        }
    }
//while

    
return 0 ;
}

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理