zoukankan      html  css  js  c++  java
  • 1433. [ZJOI2009]假期的宿舍【二分图】

    Description

    学校放假了······有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题。比如A
    和B都是学校的学生,A要回家,而C来看B,C与A不认识。我们假设每个人只能睡和自己直接认识的人的床。那么一
    个解决方案就是B睡A的床而C睡B的床。而实际情况可能非常复杂,有的人可能认识好多在校学生,在校学生之间也
    不一定都互相认识。我们已知一共有n个人,并且知道其中每个人是不是本校学生,也知道每个本校学生是否回家
    。问是否存在一个方案使得所有不回家的本校学生和来看他们的其他人都有地方住。

    Input

    第一行一个数T表示数据组数。接下来T组数据,
    每组数据第一行一个数n表示涉及到的总人数。
    接下来一行n个数,第i个数表示第i个人是否是在校学生(0表示不是,1表示是)。
    再接下来一行n个数,第i个数表示第i个人是否回家
    (0表示不回家,1表示回家,注意如果第i个人不是在校学生,那么这个位置上的数是一个随机的数,
    你应该在读入以后忽略它)。
    接下来n行每行n个数,
    第i行第j个数表示i和j是否认识
    (1表示认识,0表示不认识,第i行i个的值为0,但是显然自己还是可以睡自己的床),
    认识的关系是相互的。
    1 ≤ n ≤ 50,1 ≤ T ≤ 20

    Output

    对于每组数据,如果存在一个方案则输出“^_^”(不含引号)否则输出“T_T”(不含引号)。
    (注意输出的都是半角字符,即三个符号的ASCII码分别为94,84,95)

    Sample Input

    1
    3
    1 1 0
    0 1 0
    0 1 1
    1 0 0
    1 0 0

    Sample Output

    ^_^

    裸的二分图匹配……没什么难度

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 struct node
     6 {
     7     int to,next;
     8 } edge[5001];
     9 int a[1010],Ans[1010],head[1010],num_edge,used[1010],NOW;
    10 
    11 void add(int u,int v)
    12 {
    13     edge[++num_edge].to=v;
    14     edge[num_edge].next=head[u];
    15     head[u]=num_edge;
    16 }
    17 
    18 bool find(int x)
    19 {
    20     for (int i=head[x]; i!=0; i=edge[i].next)
    21     {
    22         if (used[edge[i].to]!=NOW)
    23         {
    24             used[edge[i].to]=NOW;
    25             if (Ans[edge[i].to]==0 || find(Ans[edge[i].to]))
    26             {
    27                 Ans[edge[i].to]=x;
    28                 return true;
    29             }
    30         }
    31     }
    32     return false;
    33 }
    34 
    35 int main()
    36 {
    37     int T;
    38     scanf("%d",&T);
    39     while (T--)
    40     {
    41         int Cnt=0,n,x,T,Sum=0;
    42         memset(edge,0,sizeof(edge));
    43         memset(used,0,sizeof(used));
    44         memset(Ans,0,sizeof(Ans));
    45         memset(head,0,sizeof(head));
    46         num_edge=0;
    47         scanf("%d",&n);
    48         for (int i=1;i<=n;++i)
    49             scanf("%d",&a[i]);
    50         for (int i=1;i<=n;++i)
    51         {
    52             scanf("%d",&x);
    53             if (a[i]==1 && x==1)
    54                 a[i]=2;
    55         }
    56         for (int i=1;i<=n;++i)
    57         {
    58             if (a[i]==1)  add(i,i),++Sum;
    59             if (a[i]==0) ++Sum;
    60             for (int j=1;j<=n;++j)
    61             {
    62                 scanf("%d",&x);
    63                 if (x==1 && (a[i]==0 || a[i]==1) && a[j]!=0)
    64                     add(i,j);
    65             }
    66         }
    67         for (int i=1;i<=n;++i)
    68         if (a[i]==0 || a[i]==1)
    69         {
    70                NOW=i;
    71                if (find(i))
    72                    ++Cnt;
    73         }
    74         if (Cnt==Sum)
    75             printf("^_^
    ");
    76         else
    77             printf("T_T
    ");
    78     }
    79 }
  • 相关阅读:
    RSS文章订阅及生成RSS格式的xml
    一次Insert插入多条数据的方法
    构建struts2项目需要使用的最少架包
    Java 的HTML 解析器jsoup
    tomcat定时启动
    栈的实现与应用
    软件加密行业的现状和发展趋势
    InstallShield 2012 Spring新功能试用(18): Suite/Advanced UI 和 Advanced UI工程的界面编辑视图中添加了控件工具栏和语言切换功能
    BUG:InstallShield 2012 Spring之前版本的帮助文档中关于StrGetTokens示例代码的错误
    InstallShield 2012 Spring新功能试用(14): Suite/Advanced UI 和 Advanced UI工程新增加InstallScript安装包的条件检测项
  • 原文地址:https://www.cnblogs.com/refun/p/8678618.html
Copyright © 2011-2022 走看看