Latin Square题解(2019 ICPC Asia Danang Regional Contest)
2021/10/18 23:11:41
本文主要是介绍Latin Square题解(2019 ICPC Asia Danang Regional Contest),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
https://vjudge.net/problem/Kattis-latinsquare
这题在说白了就是一道数独,hhhhhhhhh
训练赛的时候根本看不出是一道二分图,甚至根本没往这方面想,结束时看题解也是莫名奇妙(那篇题解没有讲解),到后面问了学长,学长提了一嘴。瞬间顿悟!!!!
首先,这个是一个二分图覆盖的模型每一行每一列只能有一个同一数字。
于是乎我们将他分解成多步,每一步就是将一个种类的数字,填进矩阵。
所以,每一步就是一个最小点覆盖,将第i行和第j列抽象成两个点,i -> j就是一条边,找不同i且不同j进行一个匹配,将所有的i和j匹配完后,就是一个最小点覆盖。
(我自己的理解,讲的不清楚可以看看代码,代码比较好理解)
#include <bits/stdc++.h> using namespace std; int maps[110][110]; int bj[110], match[110]; bool mark[110]; int n, k; int find(int x); int main() { scanf("%d%d", &n, &k); for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) { int x; scanf("%d", &x); maps[i][j] = x; mark[x] = 1; } for (int i = 1; i <= n; i++) { if (mark[i]) continue; memset(match, 0, sizeof match); for (int j = 1; j <= n; j++) { memset(bj, 0, sizeof bj); find(j); } for (int j = 1; j <= n; j++) { maps[match[j]][j] = i; } } cout << "YES\n"; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) cout << maps[i][j] << " "; cout << endl; } return 0; } int find(int x) { for (int i = 1; i <= n; i++) { if (!bj[i] && !maps[x][i]) { bj[i] = 1; if (!match[i] || find(match[i])) { match[i] = x; return 1; } } } return 0; }
这篇关于Latin Square题解(2019 ICPC Asia Danang Regional Contest)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享