然后是看@[yybyyb](/space/show?uid=21283) 这位dalao的
```cpp
#include<cstdio>
#include<cstring>
using namespace std;
struct node
{
int v;
int next;
}bed[10000];
int cnt=0;
int first[100];
int book[100],match[100];
int home[100],student[100];
int n,num,sum;
void add(int ,int );
int dfs(int);
int main()
{
int t;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
num=0;
memset(first,-1,sizeof(first));
/*memset(home,0,sizeof(home));
memset(student,0,sizeof(student));*/
scanf("%d",&n);
for(int j=1;j<=n;j++)
scanf("%d",&student[j]);
for(int j=1;j<=n;j++)
{
scanf("%d",&home[j]);
if(student[j] and home[j]==0)//如果是不回家的学生
add(j,j);//睡自己的床
}
for(int j=1;j<=n;j++)
if((student[j] and !home[j]) or !student[j])
num++;//统计要床的人数
int rub;
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
{
scanf("%d",&rub);
if(rub and student[k])//如果认识的人是学生
add(j,k);
}
memset(match,0,sizeof(match));
sum=0;
for(int j=1;j<=n;j++)
if((student[j] and home[j]==0) or !student[j])
{
memset(book,0,sizeof(book));
if(dfs(i))
sum++;
}
if(sum==num)
printf("^_^\n");
else
printf("T_T\n");
}
getchar();
getchar();
return 0;
}
void add(int u,int v)
{
bed[cnt].v=v;
bed[cnt].next=first[u];
first[u]=cnt;
cnt++;
}
int dfs(int u)
{
for(int i=first[u];i!=-1;i=bed[i].next)
{
int w=bed[i].v;
if(!book[w])
{
book[w]=1;
if(!match[w] or dfs(match[w]))
{
match[w]=u;
return 1;
}
}
}
return 0;
}
```
求dalao指出错误
by 旅人杜 @ 2018-11-08 11:39:08
好的 照题解写的方法是低级错误 循环的是j 但是我dfs(i)了,自己写的做法也是这个错误,但是改正后照题解的过了,自己写的还是错
by 旅人杜 @ 2018-11-08 12:16:48
解决了....
by 旅人杜 @ 2018-11-08 14:14:47