//改進后100分code#include<iostream>#include<string.h>#include<vector>
using namespace std;struct person
{int stu;int goHome;};
vector<int>v1,v2[55];
bool used[55];int flag,aim;int link[55];intDFS(int x){for(int i =0; i < v2[x].size(); i++){int k = v2[x][i];if(!used[k])//防止匹配到這張床之后(DFS(link[k]))又回到這張床{used[k]= true;if(!link[k]||DFS(link[k]))//這張床沒有主人or這張床有主人了但那個主人可以去別的床{link[k]= x;//讓這張床的主人為當前來匹配的這個人return1;}}}return0;}intmain(){int t,x;cin>>t;while(t--){int n;cin>>n;person data[n+5];int sum =0;for(int i =1; i <= n; i++){cin>>data[i].stu;if(data[i].stu)sum++;v2[i].clear();}v1.clear();for(int i =1; i <= n; i++){cin>>data[i].goHome;if((data[i].stu&&!data[i].goHome)||!data[i].stu){v1.push_back(i);}}aim = v1.size();for(int i =1; i <= n; i++){for(int j =1; j <= n ; j++){cin>>x;if(i==j||x){if(data[j].stu)v2[i].push_back(j);}}}flag =0;memset(link,0,sizeof(link));if(aim <= sum){int cnt =0;for(int i =0; i < v1.size(); i++){memset(used,false,sizeof(used));cnt +=DFS(v1[i]);}if(cnt == aim)//最大匹配達標flag =1;}if(flag)cout<<"^_^"<<endl;elsecout<<"T_T"<<endl;}return0;}//90分TELcode#include<iostream>#include<string.h>#include<vector>
using namespace std;struct person
{int stu;int goHome;};
vector<int>v1,v2[55];
bool used[55];int a[55][55],flag,aim;voidDFS(int now,int cnt){if(aim-now > cnt)return;if(now == aim){flag =1;return;}if(!flag){for(int i =0; i < v2[v1[now]].size(); i++){int k = v2[v1[now]][i];if(!used[k]){used[k]= true;DFS(now+1,cnt-1);used[k]= false;}}return;}}intmain(){int t;cin>>t;while(t--){int n;cin>>n;person data[n+5];int sum =0;for(int i =1; i <= n; i++){cin>>data[i].stu;if(data[i].stu)sum++;v2[i].clear();}v1.clear();for(int i =1; i <= n; i++){cin>>data[i].goHome;if((data[i].stu&&!data[i].goHome)||!data[i].stu){v1.push_back(i);}}aim = v1.size();for(int i =1; i <= n; i++){for(int j =1; j <= n ; j++){cin>>a[i][j];if(i==j||a[i][j]){if(data[j].stu)v2[i].push_back(j);}}}flag =0;memset(used,false,sizeof(used));if(aim <= sum)DFS(0,sum);if(flag)cout<<"^_^"<<endl;elsecout<<"T_T"<<endl;}return0;}