Description
Input
Output
Sample Input
1
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。
分析
直接上板子。
代码
#include <bits/stdc++.h>
#define N 50001
#define INF 0x7fffffff
int read()
{
int k=1,x=0;
char ch;
ch=getchar();
while(ch<'0' || ch>'9'){if(ch=='-') k=-1;ch=getchar();}
while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*k;
}
struct NOTE
{
int to,c,next;
}edge[N];
int n,m;
int ans=0,sum;
int tot=1,s=0,t=N;
int head[N],cur[N];
int dis[N];
int stay[N],hom[N];
void add(int x,int y,int c)
{
edge[++tot].to=y;
edge[tot].c=c;
edge[tot].next=head[x];
head[x]=tot;
}
void insert(int x,int y,int w)
{
add(x,y,w);
add(y,x,0);
}
void init()
{
m=read();
ans=0;
sum=0;
tot=1;
s=0;
t=N-5;
memset(dis,0,sizeof(dis));
memset(head,0,sizeof(head));
for(int i=1;i<=m;i++)
{
stay[i]=read();
if(stay[i]==1)
insert(i+m,t,1);
}
for(int i=1;i<=m;i++)
{
hom[i]=read();
if(stay[i]==1 && hom[i]==0 || stay[i]==0)
{
sum++;
insert(0,i,1);
}
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=m;j++)
{
int x;
x=read();
if(x || i==j)
insert(i,j+m,1);
}
}
}
bool bfs()
{
memset(dis,0,sizeof(dis));
std::queue<int> Q;
dis[s]=1;
Q.push(s);
while(!Q.empty())
{
int now=Q.front();
Q.pop();
for(int i=head[now];i;i=edge[i].next)
if(edge[i].c && !dis[edge[i].to])
{
int u=edge[i].to;
dis[u]=dis[now]+1;
if(u==t)
return true;
Q.push(u);
}
}
return false;
}
int dfs(int x,int maxf)
{
if(x==t || !maxf)
return maxf;
int ret=0;
for(int &i=cur[x];i;i=edge[i].next)
if(edge[i].c && dis[edge[i].to]==dis[x]+1)
{
int f=dfs(edge[i].to,std::min(maxf-ret,edge[i].c));
edge[i].c-=f;
edge[i^1].c+=f;
ret+=f;
if(ret==maxf)
break;
}
return ret;
}
void dinic()
{
while(bfs())
{
for(int i=s;i<=t;i++)
cur[i]=head[i];
ans+=dfs(s,INF);
}
}
int main()
{
n=read();
while(n--)
{
init();
dinic();
if(ans==sum)
puts("^_^");
else puts("T_T");
}
}