zoukankan      html  css  js  c++  java
  • 二分图 [ZJOI2007] 小Q的矩阵游戏

    【问题描述】
    小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏。矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的)。每次可以对该矩阵进行两种操作:
    l 行交换操作:选择矩阵的任意两行,交换这两行(即交换对应格子的颜色)
    l 列交换操作:选择矩阵的任意两列,交换这两列(即交换对应格子的颜色)
     
    游戏的目标,即通过若干次操作,使得方阵的主对角线(左上角到右下角的连线)上的格子均为黑色。
    对于某些关卡,小Q百思不得其解,以致他开始怀疑这些关卡是不是根本就是无解的!!于是小Q决定写一个程序来判断这些关卡是否有解。
    【输入文件】
    输入文件qmatrix.in第一行包含一个整数T,表示数据的组数。
    接下来包含T组数据,每组数据第一行为一个整数N,表示方阵的大小;接下来N行为一个N*N的01矩阵(0表示白色,1表示黑色)。
    【输出文件】
    输出文件应包含T行。对于每一组数据,如果该关卡有解,输出一行Yes;否则输出一行No。
    【样例输入】
    2
    2
    0 0
    0 1
    3
    0 0 1
    0 1 0
    1 0 0
    【样例输出】
    No
    Yes
    【数据规模】
    对于20%的数据,N≤ 7
    对于50%的数据,N≤ 50

    对于100%的数据,N≤ 200

    solution

    二分图

    如果a[i][j]==1,就把i行向j列连一条边,最后跑二分图

    (我还打了爆搜......)

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #define mem(a,b) memset(a,b,sizeof(a))
     5 using namespace std;
     6 
     7 struct son
     8 {
     9     int v,next;
    10 };
    11 son a1[100006];
    12 int first[100006],e;
    13 void addbian(int u,int v)
    14 {
    15     a1[e].v=v;
    16     a1[e].next=first[u];
    17     first[u]=e++;
    18 }
    19 
    20 int T,n;
    21 int a[206][206];
    22 bool vis[206];
    23 int match[206];
    24 
    25 bool fin(int x)
    26 {
    27     for(int i=first[x];i!=-1;i=a1[i].next)
    28     {
    29         int temp=a1[i].v;
    30         if(!vis[temp])
    31         {
    32             vis[temp]=1;
    33             if(match[temp]==-1||fin(match[temp]))
    34             {
    35                 match[temp]=x;
    36                 return 1;
    37             }
    38         }
    39     }
    40     return 0;
    41 }
    42 
    43 int main(){
    44     
    45     //freopen("qmatrix.in","r",stdin);
    46     //freopen("qmatrix.out","w",stdout);
    47     
    48     scanf("%d",&T);
    49     while(T--)
    50     {
    51         mem(match,-1);
    52         mem(a1,0);mem(first,-1);e=0;
    53         scanf("%d",&n);
    54         for(int i=1;i<=n;++i)
    55           for(int j=1;j<=n;++j)
    56                 scanf("%d",&a[i][j]);
    57         
    58         for(int i=1;i<=n;++i)
    59           for(int j=1;j<=n;++j)
    60             if(a[i][j])
    61             {
    62                     addbian(i,j);
    63                 }
    64         
    65         int num=0;
    66         for(int i=1;i<=n;++i)
    67         {
    68             mem(vis,0);
    69             if(fin(i))
    70               ++num;
    71         }
    72         
    73         if(num==n)
    74           printf("Yes
    ");
    75         else
    76           printf("No
    ");
    77     }
    78     //while(1);
    79     return 0;
    80 }
    81         
    code
  • 相关阅读:
    java工具类4-分布式id生成器
    java工具类3-签名加密
    java工具类2-获取文件base64
    Java SE入门(十)——继承与抽象
    Java SE入门(九)——静态和代码块
    Java SE入门(八)——IO流基础
    Java SE入门(七)——Java集合与实例
    Java SE入门(六)——常用基础API
    Java SE入门(五)——面向对象基础
    Java SE入门(四)——函数与方法
  • 原文地址:https://www.cnblogs.com/A-LEAF/p/7348652.html
Copyright © 2011-2022 走看看