感觉都是按题解写的QwQ
大概的思路就是:建一个超级源汇,然后把超级源点和两个源点相连,两个汇点向超级汇点连,跑一边最大流,判断一下是否满足答案。然后再把第二个的源汇反过来,重新进行一遍上面的过程,如果两次答案都可以,那么最终答案就可以;否则一次不行就不行
有哪位路过大佬大神帮忙看看么
#include <iostream>
#include <cstring>
#include <queue>
using namespace std ;
#define int long long
const int N = 20005 , INF = (2e9) ;
int n , s , t , a1 , a2 , an , b1 , b2 , bn , dis[110] ;
char ab[110][110] ;
struct Edge {
int nxt , to , len ;
} edge[N] , ed[N] ;
int cnt , head[110] ;
void insert ( int u , int v , int w ) {
// cout << " insert : " << u << " - " << v << " : " << w << "\n" ;
edge [ ++ cnt ] = { head [ u ] , v , w } ;
head [ u ] = cnt ;
edge [ ++ cnt ] = { head [ v ] , u , w } ;
head [ v ] = cnt ;
}
queue < int > q ;
bool bfs ( ) {
memset ( dis , 0 , sizeof ( dis ) ) ;
dis [ s ] = 1 ;
q .push ( s ) ;
while ( ! q .empty ( ) ) {
int x = q .front ( ) ; q .pop ( ) ;
for ( int i = head [ x ] ; i ; i = edge [ i ] .nxt ) {
int y = edge [ i ] .to ;
if ( dis [ y ] || ! edge [ i ] .len )
continue ;
dis [ y ] = dis [ x ] + 1 ;
q .push ( y ) ;
}
}
// cout << " dis : " ;
// for ( int i = 1 ; i <= n ; ++ i )
// cout << dis [ i ] << " , " ;
// cout << "\n" ;
return dis [ t ] ;
}
int dfs ( int x , int now ) {
if ( x == t )
return now ;
// cout << " dfs : " << x << " , " << now << "\n" ;
int res = now ;
for ( int i = head [ x ] ; i && res ; i = edge [ i ] .nxt ) {
int y = edge [ i ] .to ;
if ( ! edge [ i ] .len || dis [ y ] != dis [ x ] + 1 )
continue ;
int k = dfs ( y , min ( edge [ i ] .len , res ) ) ;
edge [ i ] .len -= k ;
edge [ i ^ 1 ] .len += k ;
res -= k ;
}
return now - res ;
}
void init ( ) {
cnt = 1 ;
memset ( head , 0 , sizeof ( head ) ) ;
}
signed main ( ) {
while ( cin >> n >> a1 >> a2 >> an >> b1 >> b2 >> bn && n ) {
++ a1 , ++ a2 , ++ b1 , ++ b2 ;
init ( ) ;
for ( int i = 1 ; i <= n ; ++ i ) {
cin >> ( ab [ i ] + 1 ) ;
for ( int j = i + 1 ; j <= n ; ++ j ) {
if ( ab [ i ] [ j ] == 'N' )
insert ( i , j , INF ) ;
else if ( ab [ i ] [ j ] == 'O' )
insert ( i , j , 1 ) ;
}
}
s = n + 1 , t = s + 1 ;
insert ( s , a1 , an ) , insert ( s , b1 , bn ) ;
insert ( a2 , t , an ) , insert ( b2 , t , bn ) ;
int tmp = 0 , ans = 0 ;
while ( bfs ( ) )
while ( tmp = dfs ( s , INF ) )
ans += tmp ;
if ( ans < an + bn ) {
puts ( "No" ) ;
continue ;
}
init ( ) ;
for ( int i = 1 ; i <= n ; ++ i ) {
for ( int j = i + 1 ; j <= n ; ++ j ) {
if ( ab [ i ] [ j ] == 'N' )
insert ( i , j , INF ) ;
else if ( ab [ i ] [ j ] == 'O' )
insert ( i , j , 1 ) ;
}
}
insert ( s , a1 , an ) , insert ( s , b2 , bn ) ;
insert ( a2 , t , an ) , insert ( b2 , t , bn ) ;
ans = 0 ;
while ( bfs ( ) )
while ( tmp = dfs ( s , INF ) )
ans += tmp ;
if ( ans < an + bn )
puts ( "No" ) ;
else
puts ( "Yes" ) ;
}
return 0 ;
}