zoukankan      html  css  js  c++  java
  • [BZOJ3816][清华集训2014]矩阵变换(稳定婚姻问题)

    3816: 矩阵变换

    Time Limit: 10 Sec  Memory Limit: 512 MB
    Submit: 803  Solved: 578
    [Submit][Status][Discuss]

    Description

    给出一个 N 行 M 列的矩阵A, 保证满足以下性质:
    M>N。
    矩阵中每个数都是 [0,N] 中的自然数。
    每行中, [1,N] 中每个自然数都恰好出现一次。这意味着每行中 0 恰好出现 M−N 次。
    每列中,[1,N] 中每个自然数至多出现一次。
    现在我们要在每行中选取一个非零数,并把这个数之后的数赋值为这个数。我们希望保持上面的性质4,即每列中,[1,N] 中每个自然数仍然至多出现一次。

    Input

    第一行一个正整数 T,表示数据组数。
    后面包含 T 组数据,各组数据之间无空行。每组数据以两个正整数 N,M 开始,接下来 N 行,每行 M 个用空格隔开的整数,意义如题所述。

    Output

    对于每组数据输出一行。如果有解,则输出 N 个整数,依次表示每一行取的数是多少。(这应该是一个 1 到 N 的排列)如果无解,则输出任意卖萌表情。

    Sample Input

    2
    5 10
    0 1 0 2 3 0 0 4 0 5
    2 0 3 0 0 1 0 5 4 0
    4 2 1 0 0 0 3 0 5 0
    0 3 0 4 0 5 0 1 2 0
    1 0 0 3 2 4 5 0 0 0
    5 10
    0 1 0 2 3 0 0 4 0 5
    2 0 3 0 0 1 0 5 4 0
    4 2 1 0 0 0 3 0 5 0
    0 3 0 4 0 5 0 1 2 0
    1 0 0 3 2 4 5 0 0 0

    Sample Output

    4 5 3 1 2
    5 4 3 1 2

    explanation

    两组输入数据是相同的。由于结果不唯一,你可以给出任意一组合法答案

    HINT

    对于 100% 的数据,N<200,M<400,T<50。


    卖萌表情包括但不限于“(^o^)/” (不含引号).


    由于输入数据较大, 请自行优化输入方法.


    请不要提交,期待SPJ

    Source

    [Submit][Status][Discuss]

    https://blog.csdn.net/qq_39972971/article/details/79400029

    从“无解随便输出”和“样例中没有无解情况”可以大致猜出,稳定婚姻问题保证有解。

    BZOJ上无数据,请不要输出任何东西,去UOJ上提交。

     1 #include<cstdio>
     2 #include<algorithm>
     3 #define rep(i,l,r) for (int i=l; i<=r; i++)
     4 using namespace std;
     5 
     6 const int N=205;
     7 int n,m,T,x,to[N],mx[N],a[N][N],b[N][N];
     8 
     9 int main(){
    10     freopen("bzoj3816.in","r",stdin);
    11     freopen("bzoj3816.out","w",stdout);
    12     for (scanf("%d",&T); T--; ){
    13         scanf("%d%d",&n,&m);
    14         rep(i,1,n) to[i]=mx[i]=0;
    15         rep(i,1,n) rep(j,1,m){
    16             scanf("%d",&x);
    17             if (x) a[i][++to[i]]=x,b[i][to[i]]=j;
    18         }
    19         rep(i,1,n) to[i]=1;
    20         while (1){
    21             bool flag=0;
    22             rep(i,1,n) mx[a[i][to[i]]]=max(mx[a[i][to[i]]],b[i][to[i]]);
    23             rep(i,1,n) if (mx[a[i][to[i]]]!=b[i][to[i]]){ to[i]++; flag=1; break; }
    24             if (!flag) break;
    25         }
    26         rep(i,1,n) printf("%d ",a[i][to[i]]); puts("");
    27     }
    28     return 0;
    29 }
  • 相关阅读:
    != 比 & 的优先级高
    VC++ 报错:Heap corruption detected
    sqlite 查询数据库中所有的表名,判断某表是否存在,将某列所有数值去重后获得数量
    Unicode与UTF-8,UTF-16
    各种格式的压缩包解压,7zip 命令行
    bat批处理文件运行时隐藏cmd窗口
    标准库中 vector list等排序
    duilib 实现列表头任意拖动
    duilib 实现 XML重用(item完全重合的CList)
    C++-POJ2503-Babelfish[hash]
  • 原文地址:https://www.cnblogs.com/HocRiser/p/9098557.html
Copyright © 2011-2022 走看看