BZOJ-1433: [ZJOI2009]假期的宿舍(最大流)

作者: acccccc | 来源:发表于2018-10-17 12:25 被阅读1次

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1433

赤赤裸裸的最大流水题,水过去就可以啦。

代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
 
using namespace std ;
 
#define MAXN 10100
#define AddEdge( s , t , f ) Add( s , t , f ) , Add( t , s , 0 )
#define inf 0x7fffffff
 
struct edge {
    int t , f , next ;
} e[ MAXN ] ;
 
int head[ MAXN ] , en ;
 
void Add( int s , int t , int f ) {
    e[ en ].t = t , e[ en ].f = f , e[ en ].next = head[ s ] ;
    head[ s ] = en ++ ;
}
 
int node[ MAXN ][ 2 ] , V , S , T ;
int gap[ MAXN ] , h[ MAXN ] , d[ MAXN ] ;
 
int sap( int v , int flow ) {
    if ( v == T ) return flow ;
    int rec = 0 ;
    for ( int i = d[ v ] ; i != - 1 ; i = e[ i ].next ) {
        if ( e[ i ].f && h[ v ] == h[ e[ i ].t ] + 1 ) {
            int ret = sap( e[ i ].t , min( flow - rec , e[ i ].f ) ) ;
            e[ i ].f -= ret , e[ i ^ 1 ].f += ret , d[ v ] = i ;
            if ( ( rec += ret ) == flow ) return flow ;
        }
    }
    if ( ! ( -- gap[ h[ v ] ] ) ) h[ S ] = T ;
    gap[ ++ h[ v ] ] ++ , d[ v ] = head[ v ] ;
    return rec ;
}
 
int maxflow(  ) {
    memset( gap , 0 , sizeof( gap ) ) ; 
    memset( h , 0 , sizeof( h ) ) ;
    for ( int i = 0 ; i ++ < T ; ) d[ i ] = head[ i ] ;
    gap[ 0 ] = T ;
    int flow = 0 ;
    while ( h[ S ] < T ) flow += sap( S , inf ) ;
    return flow ;
}
 
int a[ MAXN ] , b[ MAXN ] , n , tot ;
 
int main(  ) {
    scanf( "%d" , &tot ) ;
    while ( tot -- ) {
        int cnt = 0 ;
        en = V = 0 ; 
        scanf( "%d" , &n ) ;
        for ( int i = 0 ; i ++ < n ; ) {
            node[ i ][ 0 ] = ++ V , node[ i ][ 1 ] = ++ V ;
        }
        S = ++ V ; T = ++ V ;
        for ( int i = 0 ; i ++ < V ; ) head[ i ] = - 1 ;
        for ( int i = 0 ; i ++ < n ; ) scanf( "%d" , a + i ) ;
        for ( int i = 0 ; i ++ < n ; ) scanf( "%d" , b + i ) ;
        for ( int i = 0 ; i ++ < n ; ) {
            if ( a[ i ] ) AddEdge( node[ i ][ 1 ] , T , 1 ) ;
            if ( ! ( a[ i ] && b[ i ] ) ) AddEdge( S , node[ i ][ 0 ] , 1 ) , ++ cnt ;
            AddEdge( node[ i ][ 0 ] , node[ i ][ 1 ] , 1 ) ;
        }
        for ( int i = 0 ; i ++ < n ; ) {
            for ( int j = 0 ; j ++ < n ; ) {
                int x ; scanf( "%d" , &x ) ;
                if ( x ) AddEdge( node[ i ][ 0 ] , node[ j ][ 1 ] , 1 ) ;
            }
        }
        printf( maxflow(  ) == cnt ? "^_^\n" : "T_T\n" )  ;
    }
    return 0 ;
}

相关文章

  • BZOJ-1433: [ZJOI2009]假期的宿舍(最大流)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1433 赤...

  • 国庆假期封宿舍

    国庆七天小长假前夕,同学们都陆陆续续回家了,宿管部的同学们留到最后一刻 帮助同学们封好宿舍。 祝大家节日快乐,祖国...

  • 2020-5-9《大流感·最致命瘟疫的史诗》

    【主题】1918年的大流感 【书籍】《大流感——最致命瘟疫的史诗》 【作者】【美】约翰·M·巴里(John M. ...

  • 做自己

    做自己 得有做自己的自由和做自己的胆量 因为我们惯性的认为随大流安全,随大流省事,随大流也最容易明哲保身 做自己太...

  • 2017-10-06

    写生结束刚好10.1假期,10.1假期回家了,刚回到宿舍。 假期回去见了姐夫,姐姐找到了她的幸福。 学校宿舍还是原...

  • 《大流感》听书笔记

    大流感:最致命瘟疫的史诗 原作名: The Great Influenza: The Story of the D...

  • 史上最脏宿舍

    男宿舍很少有干净的,不过脏到这种地步,还是很罕见的。 犹记得第一次推开门看到的一刻,当真是万万没想到,客厅很大,可...

  • 《大流感——最致命瘟疫的史诗》

    在2018年还剩3天的时候,刘德华因嗓子问题不得不中止演唱会,现场哭着向观众鞠躬道歉,主办方后来确认他得了...

  • 我颓废了

    刚进入大学的我,对大学生活一点规划都没有,也就和舍友一样跟风随大流,上课打游戏,宿舍打游戏,周末宅宿舍。 其实我也...

  • 听樊登讲书《大流感——最致命瘟疫的史诗》有感

    听了樊登讲书《大流感——最致命瘟疫的史诗》我感触最深的是:一个军官因为他的士兵很多都感染上了大流感死亡了,...

网友评论

    本文标题:BZOJ-1433: [ZJOI2009]假期的宿舍(最大流)

    本文链接:https://www.haomeiwen.com/subject/cfnlzftx.html