标签:ref https std names ring date zjoi2009 pop ==
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define ll long long
using namespace std;
inline int read(){
int x=0,o=1;char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')o=-1,ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*o;
}
const int N=100005;
int n,s,t,max_flow,sum,sum1;
int a[N],b[N],A[N],B[N],c[105][105];
int visit[N],incf[N],pre[N];
int tot,head[N],nxt[N],to[N],w[N];
inline void add(int a,int b,int c){
nxt[++tot]=head[a];head[a]=tot;to[tot]=b;w[tot]=c;
nxt[++tot]=head[b];head[b]=tot;to[tot]=a;w[tot]=0;
}
inline bool bfs(){
memset(visit,0,sizeof(visit));
queue<int>q;q.push(s);visit[s]=1;incf[s]=1e9;
while(q.size()){
int u=q.front();q.pop();
for(int i=head[u];i;i=nxt[i]){
if(!w[i])continue;
int v=to[i];if(visit[v])continue;
incf[v]=min(incf[u],w[i]);
pre[v]=i;q.push(v);visit[v]=1;
if(v==t)return 1;
}
}
return 0;
}
inline void update(){
int x=t;
while(x!=s){
int i=pre[x];
w[i]-=incf[t];
w[i^1]+=incf[t];
x=to[i^1];
}
max_flow+=incf[t];
}
int main(){
int T=read();
while(T--){
n=read();tot=1;max_flow=0;sum=0;sum1=0;//初始化
memset(head,0,sizeof(head));
for(int i=1;i<=n;++i){
a[i]=read();
if(!a[i])A[++sum]=i;//非本校学生是一定要睡床的,加入左部分
}
for(int i=1;i<=n;++i){
b[i]=read();
if(a[i]&&!b[i])A[++sum]=i;//本校学生且不回家也是要睡床的
}
for(int i=1;i<=n;++i)if(a[i])B[++sum1]=i;//只有在校学生才有床位
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
c[i][j]=read();
for(int i=1;i<=sum;++i)
for(int j=1;j<=sum1;++j)
if(c[A[i]][B[j]]||A[i]==B[j])add(i+1,j+sum+1,1);//建二分图
s=1;t=sum+sum1+2;
for(int i=1;i<=sum;++i)add(s,i+1,1);
for(int j=1;j<=sum1;++j)add(j+sum+1,t,1);//二分图变网络流
while(bfs())update();
if(max_flow==sum)printf("^_^\n");
else printf("T_T\n");
}
return 0;
}
标签:ref https std names ring date zjoi2009 pop ==
原文地址:https://www.cnblogs.com/PPXppx/p/11614802.html