全WA,用的是ISAP
查看原帖
全WA,用的是ISAP
86624
洛谷Onlinejudge楼主2020/8/14 11:42

代码:

#include "bits/stdc++.h"
using namespace std;
#define MAXN 2200 

struct EDGE{
	int Next,To,Val;
}E[MAXN];
int Head[MAXN],Size=1;
inline void Add(int From,int To,int Val){
	E[++Size].Next=Head[From];
	Head[From]=Size;
	E[Size].Val=Val;
	E[Size].To=To;
	return;
}

int N,M,Cur[MAXN],S,T;
int Gap[MAXN],Dep[MAXN];
inline void BFS(void){
	for(register int i=1;i<=N*2+3;i++)
		Cur[i]=Head[i],Dep[i]=-1;
	queue <int> Queue;
	Queue.push(T);
	Dep[T]=0,Gap[0]=1;
	while(!Queue.empty()){
		int From=Queue.front();
		Queue.pop();
		for(register int i=Head[From];i;i=E[i].Next){
			int To=E[i].To;
			if(Dep[To]>=0)
				continue;
			Dep[To]=Dep[From]+1;
			Gap[Dep[To]]++;
			Queue.push(To);
		}
	}
	return;
}

int Sum=0,Node1,Node2;
inline int DFS(int This,int Flow){
	if(This==T){
		Sum+=Flow;
		return Flow;
	}
	int Rlow=0,Used=0;
	for(register int i=Cur[This];i;i=E[i].Next){
		int To=E[i].To;Cur[i]=i;
		if(E[i].Val<=0||Dep[This]!=Dep[To]+1)
			continue;
		Rlow=DFS(To,min(Flow-Used,E[i].Val));
		if(Rlow==0)continue;
		E[i^1].Val+=Rlow;
		E[i].Val-=Rlow;
		Used+=Rlow;
		if(Used==Rlow)return Used;
	}
	Gap[Dep[This]]--;
	if(Gap[Dep[This]]==0)
		Gap[S]=Node1+Node2+1;
	Dep[This]++;
	Gap[Dep[This]]++;
	return Used;
}

inline void ISAP(void){
	BFS();
	while(Dep[S]<(Node1+Node2)){
		for(register int i=1;i<=N*2+3;i++)
			Cur[i]=Head[i];
		DFS(S,MAXN*MAXN);
	}
	return;
}

int People[MAXN],Bed[MAXN],Know,Tt;
int main(void){
	cin>>Tt;
	for(register int Txt=1;Txt<=Tt;Txt++){
		cin>>N;Size=1;
		for(register int i=1;i<=N*3;i++)	
			Bed[i]=People[i]=Head[i]=0;
		for(register int i=1;i<=N;i++)
			cin>>Bed[i];
		for(register int i=1;i<=N;i++){
			cin>>Know;
			if(Bed[i]==1)Node2++;
			if(Know==1&&Bed[i]==1)
				People[i]=0;
			else People[i]=1,Node1++;
		}
		for(register int i=1;i<=N;i++){
			for(register int j=1;j<=N;j++){
				cin>>Know;
				if((i==j||Know==1)&&Bed[j]==1&&People[i]==1)
					Add(i,N+j,1),Add(N+j,i,0);
			}
		}
		S=N*2+1,T=N*2+2,Sum=0;
		for(register int i=1;i<=N;i++)
			if(People[i]==1)
				Add(S,i,1),Add(i,S,0);
		for(register int i=1;i<=N;i++)
			if(Bed[i]==1)
				Add(N+i,T,1),Add(T,N+i,0);
		ISAP();
		N=N*2;
		if(Sum>=Node1)
			cout<<"^_^"<<endl;
		else cout<<"T_T"<<endl;
	}
	return 0;
}
2020/8/14 11:42
加载中...