Description
![](http://www.lydsy.com/JudgeOnline/images/1432_1.jpg)
Input
![](http://www.lydsy.com/JudgeOnline/images/1432_2.jpg)
Output
![](http://www.lydsy.com/JudgeOnline/images/1432_3.jpg)
Sample Input
1
3
1 1 0
0 1 0
0 1 1
1 0 0
1 0 0
3
1 1 0
0 1 0
0 1 1
1 0 0
1 0 0
Sample Output
ˆ ˆ
HINT
对于30% 的数据满足1 ≤ n ≤ 12。
对于100% 的数据满足1 ≤ n ≤ 50,1 ≤ T ≤ 20。
网络流模板题。也可以用二分图匹配来做。
源连有床位的i
要住宿的j'连向汇
然后认识的互相连,跑最大流就可以了
【每次i拆点都写成i和i*2,然后就只能往死里查错】
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
int head[100001];
struct map
{
int f;
int s,t;
int next;
}a[50001];
int pe[5001];
int edge;
int p;
int q[400001],d[400001];
inline void add(int s,int t,int f)
{
a[edge].next=head[s];
head[s]=edge;
a[edge].s=s;
a[edge].t=t;
a[edge].f=f;
}
inline bool bfs()
{
int l=0,r=0;
memset(q,0,sizeof(q));
r++;
q[r]=0;
memset(d,-1,sizeof(d));
d[0]=0;
int i,k;
while(l<r)
{
l++;
int k=q[l];
for(i=head[k];i!=0;i=a[i].next)
{
if(a[i].f>0&&d[a[i].t]==-1)
{
d[a[i].t]=d[k]+1;
r++;
q[r]=a[i].t;
}
}
}
if(d[p]>=0)
return true;
return false;
}
inline int dfs(int k,int s)
{
if(k==p)
return s;
int t=s;
int i;
for(i=head[k];i!=0;i=a[i].next)
{
if(d[a[i].t]==d[k]+1&&a[i].f>0)
{
int xx=dfs(a[i].t,min(s,a[i].f));
a[i].f-=xx;
if(i%2==0)
a[i-1].f+=xx;
else
a[i+1].f+=xx;
s-=xx;
}
}
return t-s;
}
inline int maxflow()
{
int s=0;
while(bfs())
s+=dfs(0,2100000000);
return s;
}
int main()
{
//freopen("holiday.in","r",stdin);
//freopen("holiday.out","w",stdout);
int T;
scanf("%d",&T);
while(T>0)
{
T--;
int n;
scanf("%d",&n);
memset(a,0,sizeof(a));
memset(head,0,sizeof(head));
edge=0;
p=2*n+1;
int x;
int sum=0;
int i,j;
for(i=1;i<=n;i++)
{
scanf("%d",&pe[i]);
if(pe[i]==1)
{
edge++;
add(0,i,1);
edge++;
add(i,0,0);
}
}
for(i=1;i<=n;i++)
{
scanf("%d",&x);
if(x==0||pe[i]==0)
{
edge++;
add(i+n,p,1);
edge++;
add(p,i+n,0);
sum++;
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
scanf("%d",&x);
if(i==j)
{
edge++;
add(i,j+n,1);
edge++;
add(j+n,i,0);
}
else if(x==1)
{
edge++;
add(i,j+n,1);
edge++;
add(j+n,i,0);
}
}
}
if(maxflow()==sum)
printf("%c%c%c\n",94,95,94);
else
printf("%c%c%c\n",84,95,84);
}
return 0;
}