题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2819

题目大意:

  给出一个N*N的0/1矩阵,只能交换整行或者整列,问最少交换多少次可以变成一个主对角线上的数都为1的矩阵。

解题思路:

  对行和列进行二分匹配,如果行和列之间不是完全匹配,直接输出 -1;否则就对匈牙利算法匹配后的得到的每一列对应的行进行操作(当然你也可以是对列进行操作,后面的交换也要进行相应的调整),如果行i不对应于列i,而行j对应列i,那么交换第i,j列。好题!

AC代码:

 #include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=+;
bool link[maxn][maxn],vis[maxn];
int col[maxn]; //记录匈牙利算法跑完以后各列所匹配的行
int N;
pair<int,int> ans[maxn];
bool finds(int x){
for(int i=;i<=N;i++){
if(link[x][i]&&!vis[i]){
vis[i]=true;
if(col[i]==||finds(col[i])){
col[i]=x;
return true;
}
}
}
return false;
}
int main(){
int t;
while(scanf("%d",&N)==){
for(int i=;i<=N;i++){
for(int j=;j<=N;j++){
scanf("%d",&t);
if(t) link[i][j]=true;
else link[i][j]=false;
}
}
memset(col,false,sizeof(col));
bool no=false;
for(int i=;i<=N;i++){
memset(vis,false,sizeof(vis));
if(!finds(i)){
no=true; break;
}
}
if(no) printf("-1\n");
else{
int cnt=;
for(int i=;i<=N;i++){
if(col[i]==i) continue;
else{
for(int j=i+;j<=N;j++){
if(col[j]==i){
ans[cnt]=make_pair(i,j);
col[j]=col[i];
cnt++;
}
}
}
}
printf("%d\n",cnt);
for(int i=;i<cnt;i++){
printf("C %d %d\n",ans[i].first,ans[i].second);
}
}
}
return ;
}

HDU2819的更多相关文章

  1. hdu1281+hdu2819(最大匹配数)

    分析:将行和列缩点,即行对应二分图的X部,列对应二分图的Y部,然后交点为连接该行和该列的一条边.匹配时每点都会把整行整列占了,因此就不会出现冲突了. 传送门:hdu1281 棋盘游戏 #include ...

  2. HDU2819 Swap —— 二分图最大匹配

    题目链接:https://vjudge.net/problem/HDU-2819 Swap Time Limit: 2000/1000 MS (Java/Others)    Memory Limit ...

  3. hdu-2819.swap(二分匹配 + 矩阵的秩基本定理)

    Swap Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  4. Swap[HDU2819]

    SwapTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission ...

  5. hdu2819二分图匹配

    Given an N*N matrix with each entry equal to 0 or 1. You can swap any two rows or any two columns. C ...

  6. Hdu2819 Swap

    Swap Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  7. HDU2819(KB10-E 二分图最大匹配)

    Swap Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  8. HDU2819:Swap(二分图匹配)

    Swap Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  9. HDU-2819

    Swap Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  10. HDU2819(二分图匹配,记录过程)

    Swap Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

随机推荐

  1. 汉字编码对照表(gb2312/Big5/GB2312)

    一.汉字编码的种类 1.GB2312又称国标码,由国家标准总局发布,1981年5月1日实施,通行于大陆.新加坡等地也使用此编码.它是一个简化字的编码规范,当然也包括其他的符号.字母.日文假名等,共74 ...

  2. wampserver安装之后无法打开localhost

    2019独角兽企业重金招聘Python工程师标准>>> 如上图 是服务未成功启动 服务成功启动标志 修改服务器监听端口 在安装完wampserver,打开,如果在状态栏上的图标不是绿 ...

  3. Shiro(一):Shiro介绍及主要流程

    什么是Shiro Apache Shiro是一个强大且灵活的开源安全框架,易于使用且好理解,撇开了搭建安全框架时的复杂性. Shiro可以帮助我们做以下几件事: 认证使用者的身份 提供用户的访问控制, ...

  4. 崛起于Springboot2.X之开发拦截器(21)

    为什么80%的码农都做不了架构师?>>>   序言:几乎所有项目都需要拦截器,所以小伙伴们必须要掌握这门技术哦,不然只会mybaits增删改查那是实习生干的活呀. 1.创建拦截器类, ...

  5. Excel中拆分列

    常常在linux下我们写个shell,结果输出至txt中需要把数据一条一条的抠出来,也是很累人的事情,而直接输出值excel中的话相对较简单,但是会集中在第一列.这时候也不用担心,在Excel中选择第 ...

  6. #Week8 Advice for applying ML & ML System Design

    一.Evaluating a Learning Algorithm 训练后测试时如果发现模型表现很差,可以有很多种方法去更改: 用更多的训练样本: 减少/增加特征数目: 尝试多项式特征: 增大/减小正 ...

  7. Spring IOC的核心机制:实例化与注入

    上文我们介绍了IOC和DI,IOC是一种设计模式,DI是它的具体实现,有很多的框架都有这样的实现,本文主要以spring框架的实现,来看具体的注入实现逻辑. spring是如何将对象加入容器的 spr ...

  8. socket编程之时间回射服务器

    使用到的函数: // 返回值:读到的字节数,若已到文件尾,返回0:若出错,返回-1 ssize_t read(int fd, void *buf, size_t nbytes); // 返回值:若成功 ...

  9. IDEA2020版使用

    idea2020版本出来了,不知道小伙伴使用了吗?是不是还在为激活而烦恼呢?我来给小伙伴解决烦恼了,直接上硬货,解决方法我是在B站找到,所以分享出来! 1.直接进IDEA官网下载最近的idea,官网连 ...

  10. 201771030117-祁甜 实验一 软件工程准备—<阅读《现代软件工程——构建之法》提出的三个问题>

    项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/nwnu2020SE 这个作业要求链接 https://www.cnblogs.com/nwnu- ...