Discription
给出一个 N 行 M 列的矩阵A, 保证满足以下性质:
    1.M>N。
    2.矩阵中每个数都是 [0,N] 中的自然数。
    3.每行中, [1,N] 中每个自然数都恰好出现一次。这意味着每行中 0 恰好出现 M−N 次。
    4.每列中,[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。

不难证明答案是一个排列,所以就相当于一行 和一个数匹配,并且要满足:如果某一行i的某个数x在这一行选的数的左边,并且x这个数在和x这个数匹配的行中的位置比x在i中的位置要靠左,那么就是不合法的。

所以就想到了稳定婚姻问题,用每一行去尽量匹配在这一行靠前的位置的数,而如果有冲突的话 数要选择 在那一行排在靠后位置的行。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define pb push_back
const int maxn=205;
int T,n,m,V[maxn][maxn],now;
int pos[maxn],M[maxn][maxn];
int H[maxn],W[maxn];
queue<int> q; inline bool MERRY(int man,int woman){
if(!H[woman]||V[woman][man]>V[woman][H[woman]]){
if(H[woman]) q.push(H[woman]);
H[woman]=man;
return 1;
}
return 0;
} inline void mate(){
for(int i=1;i<=n;i++) q.push(i); int x;
while(!q.empty()){
x=q.front(),q.pop();
if(!MERRY(x,M[x][++pos[x]])) q.push(x);
}
} inline void solve(){
memset(H,0,sizeof(H));
memset(pos,0,sizeof(pos));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
scanf("%d",&now);
if(now) M[i][++pos[i]]=now,V[now][i]=j;
}
memset(pos,0,sizeof(pos)); mate(); for(int i=1;i<=n;i++) W[H[i]]=i;
for(int i=1;i<n;i++) printf("%d ",W[i]);
printf("%d\n",W[n]);
} int main(){
scanf("%d",&T);
while(T--) solve();
return 0;
}

  

UOJ 41. 矩阵变换的更多相关文章

  1. uoj 41 【清华集训2014】矩阵变换 婚姻稳定问题

    [清华集训2014]矩阵变换 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/41 Description 给出 ...

  2. [UOJ 41]【清华集训2014】矩阵变换

    Description 给出一个 $N$ 行 $M$ 列的矩阵A, 保证满足以下性质: $M > N$. 矩阵中每个数都是 $[0, N]$ 中的自然数. 每行中, $[1, N]$ 中每个自然 ...

  3. UOJ#41. 【清华集训2014】矩阵变换 构造

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ41.html 题解 首先写个乱搞: 一开始每一行都选择第一个非0元素,然后,我们对这个方案不断做更新,直到 ...

  4. UOJ.41.[清华集训2014]矩阵变换(稳定婚姻)

    题目链接 稳定婚姻问题:有n个男生n个女生,每个男/女生对每个女/男生有一个不同的喜爱程度.给每个人选择配偶. 若不存在 x,y未匹配,且x喜欢y胜过喜欢x当前的配偶,y喜欢x也胜过y当前的配偶 的完 ...

  5. bzoj 3816&&uoj #41. [清华集训2014]矩阵变换

    稳定婚姻问题: 有n个男生,n个女生,所有女生在每个男生眼里有个排名,反之一样. 将男生和女生两两配对,保证不会出现婚姻不稳定的问题. 即A-1,B-2 而A更喜欢2,2更喜欢A. 算法流程: 每次男 ...

  6. 【UOJ #110】【APIO 2015】Bali Sculptures

    http://uoj.ac/problem/110 这道题subtask4和subtask5是不同的算法. 主要思想都是从高位到低位贪心确定答案. 对于subtask4,n比较小,设\(f(i,j)\ ...

  7. [BZOJ3816][清华集训2014]矩阵变换(稳定婚姻问题)

    3816: 矩阵变换 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 803  Solved: 578[Submit][Status][Discuss] ...

  8. 【月入41万】Mono For Android中使用百度地图SDK

    借助于Mono For Android技术,.Net开发者也可以使用自己熟悉的C#语言以及.Net来开发Android应用.由于Mono For Android把Android SDK中绝大部分类库都 ...

  9. 虚拟机上装uoj

    前期准备: x64 ubuntu 镜像.vmware.ss账号 注意一定要有64位镜像! ss不是必须的,不过没有的话就等着下载一晚上吧... 首先先装好ubuntu,我装的是ubuntu-16.04 ...

随机推荐

  1. LeetCode 数组中的第K个最大元素

    在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 ...

  2. 初涉最小表示法&&bzoj1398: Vijos1382寻找主人 Necklace

    把最小表示法的坑填了 Description 给定两个项链的表示,判断他们是否可能是一条项链. Input 输入文件只有两行,每行一个由0至9组成的字符串,描述一个项链的表示(保证项链的长度是相等的) ...

  3. Redis string类型常用操作

      Redis 有 string.list.set.zset.hash数据类型.string类型是最基础的,其他类型都是在string类型上去建立的,所以了解熟悉string类型的常用操作对于学习re ...

  4. 【OS_Linux】yum命令安装软件

    1.YUM的简介 Yum(全称为 Yellow dog Updater, Modified)是一个rpm包管理器.它能够从指定的服务器上自动下载RPM包并安装,可以自动处理包之间的依赖性关系,并且一次 ...

  5. 使用Hexo+Github搭建属于自己的博客

    工具:Visual Studio Code/MarkdownPad技术:Hexo+Github 创建Github项目 Github账户注册和新建项目,项目必须要遵守格式:账户名.github.io,不 ...

  6. python 列表(增删改查)

    列表 :(列表可以嵌套,列表的中的元素可以为任意) 列表的创建:1.   a = [1, 2, 3] 2.   a = list([1, 2, 3]) 1.查: 索引(下标),都是从0开始 切片 .c ...

  7. (转)UILabel常用属性

    Java代码 收藏代码 #import "ViewController.h" #import <CoreText/CoreText.h> @interface View ...

  8. Linux内核中的段属性

    #define __init __attribute__ ((__section__ (".init.text")))

  9. 菜鸟的《Linux程序设计》学习——MySQL数据库安装、配置及基本操作

    1. MySQL数据库: 在涉及到一些大型的Web系统或者嵌入式软件的开发时,都少不了用数据库来管理数据.在Windows操作系统下,使用过各种各样的数据库,如:sqlServer.Oracle.My ...

  10. cs231n课程索引

    课程资源 课程官网 课程视频-youtube 课程视频-字幕版 官方笔记 官方笔记-中文版 课程作业参考答案