BZOJ-1006: [HNOI2008]神奇的国度(弦图的最小染色,完美消除序列最大势算法)

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std ;
#define AddEdge( s , t ) Add( s , t ) , Add( t , s )
#define MAXN 10100
#define inf 0x7fffffff
struct edge {
        edge *next ;
        int t ;
} *head[ MAXN ] ;
void Add( int s , int t ) {
        edge *p = new( edge ) ;
        p -> t = t , p -> next = head[ s ] ;
        head[ s ] = p ;
}
int n , m , ans = 0 , c[ MAXN ] , l[ MAXN ] ;
bool f[ MAXN ] , F[ MAXN ] ;
int main(  ) {
        scanf( "%d%d" , &n , &m ) ;
        memset( head , 0 , sizeof( head ) ) ;
        while ( m -- ) {
               int s , t ; scanf( "%d%d" , &s , &t ) ;
               AddEdge( s , t ) ;
        }
        memset( f , false , sizeof( f ) ) ;
        memset( l , 0 , sizeof( l ) ) ;
        for ( int i = 0 ; i ++ < n ; ) {
               int rec = - inf , ret ;
               for ( int j = 0 ; j ++ < n ; ) if ( ! f[ j ] && l[ j ] > rec ) {
                       rec = l[ j ] , ret = j ;
               }
               for ( int j = 0 ; j ++ < n ; ) F[ j ] = true ;
               f[ ret ] = true ;
               for ( edge *p = head[ ret ] ; p ; p = p -> next ) if ( ! f[ p -> t ] ) {
                       l[ p -> t ] ++ ;
               } else {
                       F[ c[ p -> t ] ] = false ;
               }
               for ( int j = 0 ; j ++ < n ; ) if ( F[ j ] ) {
                       c[ ret ] = j , ans = max( ans , j ) ;
                       break ;
               }
        }
        printf( "%d\n" , ans ) ;
        return 0 ;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值