求助:最大流30分WA
查看原帖
求助:最大流30分WA
68882
灵华楼主2022/5/28 21:40

感觉都是按题解写的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 ;
}
2022/5/28 21:40
加载中...