BZOJ 1433: [ZJOI2009]假期的宿舍
Submit: 3265 Solved: 1369
[Submit][Status][Discuss]
Description
Input
Output
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。
Source
吐槽一下洛谷。。
明明输出格式错了显示WA。。
QAQ 改了老半天才知道格式错了
二分图+网络流
#include <cstring> #include <cstdio> #include <queue> #define N 50000 using namespace std; int T,n,nextt[N],to[N],flow[N],head[N],cnt=1,dep[N],zx[N],ans; inline void init() { cnt=1; ans=0; memset(head,0,sizeof(head)); memset(nextt,0,sizeof(nextt)); } inline void ins(int u,int v,int w) { nextt[++cnt]=head[u]; to[cnt]=v; flow[cnt]=w; head[u]=cnt; } bool bfs(int S,int T) { for(int i=S;i<=T;++i) dep[i]=-1; queue<int>q; dep[S]=0; q.push(S); for(int now;!q.empty();) { now=q.front();q.pop(); for(int i=head[now];i;i=nextt[i]) { int v=to[i]; if(dep[v]==-1&&flow[i]) { dep[v]=dep[now]+1; if(v==T) return true; q.push(v); } } } return false; } int dfs(int now,int T,int Limit) { if(now==T||!Limit) return Limit; int ret=0,f; for(int i=head[now];i;i=nextt[i]) { int v=to[i]; if(dep[v]==dep[now]+1&&flow[i]&&(f=dfs(v,T,min(Limit,flow[i])))) { ret+=f; Limit-=f; flow[i]-=f; flow[i^1]+=f; if(!Limit) break; } } if(ret!=Limit) dep[now]=-1; return ret; } int Dinic(int S,int T) { for(;bfs(S,T);ans-=dfs(S,T,0x3f3f3f3f)); return ans; } int Main() { scanf("%d",&T); for(int n,x;T--;) { init(); scanf("%d",&n); int S=0,T=n*n+1; for(int i=1;i<=n;++i) { scanf("%d",&zx[i]); if(zx[i]) ins(i+n,T,1),ins(T,i+n,0); } for(int i=1;i<=n;++i) { scanf("%d",&x); if((!x&&zx[i])||!zx[i]) ins(S,i,1),ins(i,S,0),ans++; } for(int i=1;i<=n;++i) { if(zx[i]) ins(i,i+n,1),ins(i+n,i,0); for(int j=1;j<=n;++j) { scanf("%d",&x); if(x) ins(i,j+n,1),ins(j+n,i,0); } } if(Dinic(S,T)==0) printf("%c%c%c\n",94,95,94); else printf("%c%c%c\n",84,95,84); } return 0; } int sb=Main(); int main(int argc,char *argv[]){;}
我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。