re 50pts求助
查看原帖
re 50pts求助
342036
Star_V楼主2023/7/28 10:07
#include<bits/stdc++.h>
using namespace std;
int n;
int t;
int a[305][305];
int match[5005];
int head[40005];
int cnt;
struct edge
{
	int to;
	int nex;
}e[5005];
void add(int x,int y)
{
	e[++cnt]=(edge)
	{
		y,head[x]
	};
	head[x]=cnt;
}
int vis[605];
inline bool dfs(int x)
{
	for(int i=head[x];i;i=e[i].nex)
	{
		int v=e[i].to;
		if(vis[v]) continue;
		vis[v]=1;
		if(match[v]==0)
		{
			match[v]=x;
			return 1;
		}
		if(match[v]&&dfs(match[v]))
		{
			match[v]=x;
			return 1;
		}
	}
	return 0;
}
int main()
{
	cin>>t;
	for(int kim=1;kim<=t;kim++)
	{
		cin>>n;
		for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
		{
			cin>>a[i][j];
			if(a[i][j]) add(i,n+j);
		}
		int ans=0;
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=2*n;j++)
		{
			vis[j]=0;
		}
			if(dfs(i))
			{
			//	cout<<i<<endl;
				ans++;
			}
		}
//		cout<<ans<<endl;
		if(ans==n) cout<<"Yes"<<endl;
		else cout<<"No"<<endl;
		for(int i=1;i<=2*n;i++)
		{
		    head[i]=0;
		}
        for(int j=1;j<=cnt;j++)
        {
            e[j].nex=0;
            e[j].to=0;
		}
		for(int i=1;i<=2*n;i++)
		{
			match[i]=0;
		}
		cnt=0;
	}
	return 0;
}
2023/7/28 10:07
加载中...