zoukankan      html  css  js  c++  java
  • BZOJ 1059 [ZJOI2007]矩阵游戏 二分图匹配

    二分图匹配。

    如果i行j列是1,则i向j连边。如果这个二分图能够完全匹配了,则有解,反之无解。

    View Code
     1 #include <iostream>
     2 #include <cstring>
     3 #include <cstdio>
     4 #include <cstdlib>
     5 #include <algorithm>
     6 
     7 #define N 222
     8 #define M 55555
     9 
    10 using namespace std;
    11 
    12 int head[N],next[M],to[M];
    13 int cnt,n,linky[N];
    14 bool vis[N];
    15 
    16 inline void add(int u,int v)
    17 {
    18     to[cnt]=v; next[cnt]=head[u]; head[u]=cnt++;
    19 }
    20 
    21 inline void read()
    22 {
    23     memset(head,-1,sizeof head); cnt=0;
    24     scanf("%d",&n);
    25     for(int i=1,a;i<=n;i++)
    26         for(int j=1;j<=n;j++)
    27         {
    28             scanf("%d",&a);    
    29             if(a) add(i,j);
    30         }
    31 }
    32 
    33 inline bool dfs(int x)
    34 {
    35     for(int i=head[x];~i;i=next[i])
    36     {
    37         if(vis[to[i]]) continue;
    38         vis[to[i]]=true;
    39         if(linky[to[i]]==-1||dfs(linky[to[i]]))
    40         {
    41             linky[to[i]]=x;
    42             return true;
    43         }
    44     }
    45     return false;
    46 }
    47 
    48 inline void go()
    49 {
    50     memset(linky,-1,sizeof linky);
    51     for(int i=1;i<=n;i++)
    52     {
    53         memset(vis,0,sizeof vis);
    54         dfs(i);
    55     }
    56     for(int i=1;i<=n;i++)
    57         if(linky[i]==-1) {puts("No");return;}
    58     puts("Yes");
    59 }
    60 
    61 int main()
    62 {
    63     int cas; scanf("%d",&cas);
    64     while(cas--) read(),go();
    65     return 0;
    66 }
    没有人能阻止我前进的步伐,除了我自己!
  • 相关阅读:
    O(n^2)的排序方法
    99乘法表
    excel 转 csv
    批量关闭 excel
    tomcat 加入服务
    文件打包 zip
    字符串转换
    List数组种删除数据
    mybatis 批量上传
    sql server 查询表字段及类型
  • 原文地址:https://www.cnblogs.com/proverbs/p/2956862.html
Copyright © 2011-2022 走看看