用了最大匹配—二分图,全WA
查看原帖
用了最大匹配—二分图,全WA
216909
Viktley楼主2020/8/26 12:41
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<queue>
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
#define ll long long

using namespace std;

const int MAX=2147483647;
const int N=5e1+10;
struct node{int u, v, next;} e[2*N];
int t, n, s[N], h[N], know, need, tot, ans, hd[N], link[N];
bool cover[N];

void add(int x, int y) {e[++tot]=(node){x, y, hd[x]}; hd[x]=tot;}

int find(int x)
{
	for(int i=hd[x]; i; i=e[i].next)
	{
		int y=e[i].v;
		if(!cover[y])
		{
			cover[y]=1;
			int q=link[y];
			if(!q || find(q)) return 1;
			link[y]=q;
		}
	}
	return 0;
}

int main()
{
	//fre();
	scanf("%d", &t);
	while(t--)
	{
		tot=need=ans=0;
		memset(hd, 0, sizeof(hd));
		memset(e, 0, sizeof(e));
		memset(link, 0, sizeof(link));
		memset(s, 0, sizeof(s));
		memset(h, 0, sizeof(h));
		scanf("%d", &n);
		for(int i=1; i<=n; i++) scanf("%d", &s[i]);
		for(int i=1; i<=n; i++)
		{
			scanf("%d", &h[i]);
			if(!h[i] && s[i]) add(i, i);
		}
		for(int i=1; i<=n; i++)
		{
			for(int j=1; j<=n; j++)
			{
				scanf("%d", &know);
				if(know && s[j]) add(i, j);
			}
		}
		for(int i=1; i<=n; i++)
			if(!s[i] || (s[i] && !h[i])) need++;
		for(int i=1; i<=n; i++)
			if(!s[i] || (s[i] && !h[i]))
				memset(cover, 0, sizeof(cover)), ans+=find(i);	
		if(ans == need) printf("^_^\n");
		else printf("T_T\n");
	}
	return 0;
}

2020/8/26 12:41
加载中...