NewTrain1 T2: [ZJOI2007]矩阵游戏

Posted li-dox

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NewTrain1 T2: [ZJOI2007]矩阵游戏相关的知识,希望对你有一定的参考价值。

题目分析

显然,一行上如果在第j列为‘1’,那么这一行就可以被换到第j行。换一个说法,题目就是让我们判断是否有一个方案,使得每一行i都有列上满足i位置是1行来跟他匹配。

显然这是个二分图匹配(列->行),直接建图跑Dinic即可。

  1 #include<bits/stdc++.h>
  2 #define INTMAX 2147483647LL
  3 #define PII pair<int,int>
  4 #define MK make_pair
  5 #define re register
  6 using namespace std;
  7 typedef long long ll;
  8 const double Pi=acos(-1.0);
  9 const int Inf=0x3f3f3f3f;
 10 const int MAXN=405;
 11 inline int read()
 12     re int x=0,f=1,ch=getchar();
 13     while(!isdigit(ch))f=ch==-?-1:1,ch=getchar();
 14     while(isdigit(ch))x=x*10+ch-48,ch=getchar();
 15     return x*f;
 16 
 17 inline ll readll()
 18     re ll x=0,f=1,ch=getchar();
 19     while(!isdigit(ch))f=ch==-?-1:1,ch=getchar();
 20     while(isdigit(ch))x=x*10+ch-48,ch=getchar();
 21     return x*f;
 22 
 23 
 24 struct Edge
 25     int to,nxt,cap;
 26 e[MAXN*MAXN<<1];
 27 int cnt=1,head[MAXN];
 28 inline void add_edge(int u,int v,int cap)
 29     e[++cnt].to=v;e[cnt].cap=cap;e[cnt].nxt=head[u];head[u]=cnt;
 30     e[++cnt].to=u;e[cnt].cap=0;e[cnt].nxt=head[v];head[v]=cnt;
 31  
 32 
 33 int TT,n,S,T,Maxflow;
 34 int dep[MAXN];
 35 inline void Init()
 36     cnt=1;Maxflow=0;
 37     memset(head,0,sizeof(head));
 38     memset(e,0,sizeof(e));
 39 
 40 queue<int> q;
 41 inline bool bfs()
 42     while(!q.empty()) q.pop();
 43     memset(dep,0,sizeof(dep));
 44     dep[S]=1;q.push(S);
 45     while(!q.empty())
 46         int x=q.front();q.pop();
 47         for(int i=head[x],y;i;i=e[i].nxt)
 48             y=e[i].to;
 49             if(e[i].cap&&!dep[y])
 50                 dep[y]=dep[x]+1;
 51                 q.push(y);
 52             
 53         
 54     
 55     return dep[T];
 56  
 57 inline int dfs(int x,int flow)
 58     if(x==T||!flow)    return flow;
 59     int used=0;
 60     for(int i=head[x],y;i;i=e[i].nxt)
 61         y=e[i].to;
 62         if(e[i].cap&&dep[y]==dep[x]+1)
 63             int f=dfs(y,min(e[i].cap,flow-used));
 64             if(f)
 65                 e[i].cap-=f;
 66                 e[i^1].cap+=f;
 67                 used+=f;
 68                 if(used==flow) break;
 69             
 70         
 71     
 72     return used;
 73 
 74 
 75 inline void Dinic()
 76     while(bfs())
 77         Maxflow+=dfs(S,Inf);
 78     
 79 
 80 int main()
 81     TT=read();
 82     while(TT--)
 83         Init();
 84         n=read();
 85         S=402;T=403;
 86         for(int i=1,x;i<=n;++i)
 87             add_edge(S,i,1);
 88             add_edge(i+n,T,1);
 89             for(int j=1;j<=n;++j)
 90                 x=read();
 91                 if(x)
 92                     add_edge(i,n+j,1);
 93             
 94         
 95         Dinic();
 96         if(Maxflow==n) puts("Yes");
 97         else puts("No");
 98     
 99     return 0;
100 

 

以上是关于NewTrain1 T2: [ZJOI2007]矩阵游戏的主要内容,如果未能解决你的问题,请参考以下文章

1057: [ZJOI2007]棋盘制作

bzoj 1059: [ZJOI2007]矩阵游戏 二分图匹配

[ZJOI2007]时态同步

1096: [ZJOI2007]仓库建设

[ZJOI2007]仓库建设

[ZJOI2007]矩阵游戏