```cpp
#include<bits/stdc++.h>
using namespace std;
int n,m,t;
//数组开小一点,看看数据范围!!!
vector<int>edge[110];
int vis[110],f[110];
bool dfs(int u)
{
for(int i=0;i<edge[u].size();i++) //for(auto v:e[u]) c++11 以上就可以这么用了
{
int v=edge[u][i];
if(!vis[v])
{
vis[v]=1;
if(!f[v]||dfs(f[v]))
return f[v]=u,1;
}
}
return 0;
}
int k[110],g[110];
void solve()
{
int sum=0;
cin>>n;
for(int i=1;i<=n;i++)
cin>>k[i];
for(int i=1;i<=n;i++)
{
cin>>g[i];
if(k[i]==0) g[i]=0; //题目说了不是在校生的人对应的是乱码。因为不在校生肯定要住校,所以要手动赋值为 0
if(k[i]==1&&g[i]==1)
sum++;
}
for(int i=1;i<=n;i++)
{
if(k[i]==1&&g[i]==0)
edge[i].push_back(i+n);
//这里,跑路的住校生你直接连边了,应该是不能连的,你可以想一想
for(int j=1;j<=n;j++)
{
int l;
cin>>l;
if(l==1&&(k[j]==1&&g[i]==0)) //你这个判定标准有问题啊,只判了 i,那就是所有的 j 都会被连边
{
edge[i].push_back(j+n);
}
}
}
int ans=0;
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
ans+=dfs(i);
}
if(ans==n-sum)
cout<<"^_^\n";
else
cout<<"T_T\n";
//多测要清空!多测要清空!多测要清空!多测要清空!多测要清空!多测要清空!
//多测要清空!多测要清空!多测要清空!多测要清空!多测要清空!多测要清空!
//多测要清空!多测要清空!多测要清空!多测要清空!多测要清空!多测要清空!
for(int i=1;i<=n*2;i++){
edge[i].clear();
f[i]=k[i]=g[i]=0;
}
}
int main()
{
int T;
cin>>T;
while(T--)
{
solve();
}
return 0;
}
```
by 海盐蒟蒻冻 @ 2023-09-29 11:02:07
@[lonely_cyx](/user/276588) 另外还有一个个人建议,就是发帖的时候尽量不要带“妹子”,不然有可能会被攻击“你也想被抱走吗?”。并且现在妹子也不值钱了,你这么写也不会吸引眼球什么的。别问我怎么知道的。
by 海盐蒟蒻冻 @ 2023-09-29 11:08:12
@[海盐蒟蒻冻](/user/322266) 也不是不可以
by lonely_cyx @ 2023-10-04 08:49:10