这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
2020-2021:teams:manespace:2020_07_18-2020_07_24周报_week11 [2020/07/24 14:37] iuiou |
2020-2021:teams:manespace:2020_07_18-2020_07_24周报_week11 [2020/07/31 10:33] (当前版本) quantumbolt |
||
---|---|---|---|
行 1: | 行 1: | ||
- | ======2020/07/18–2020/07/24周报(week10)====== | + | ======2020/07/18–2020/07/24周报(week11)====== |
+ | |||
+ | =====本周推荐===== | ||
+ | ====by iuiou==== | ||
+ | * **题源**:[[https://codeforces.com/contest/1385/problem/G]] | ||
+ | |||
+ | * **题意**:给定两排数,每排都有$n$个数,每次操作可以交换一列的两个数,问能否存在一个最少的交换方案,使操作之后每一行都是$1$到$n$的一个排列。 | ||
+ | |||
+ | ***知识点**:dfs | ||
+ | |||
+ | * **题解**:这题有点难想,大致是一个二分图的问题。首先遍历两行数,如果一个数的出现次数超过了2次,那么肯定不成立。如果所有数出现次数都是两次,那么一定有一种方案满足。现定四个数组$r1[n],r2[n],b1[n],b2[n],b$数组用于存放列数,$r$数组用于存放行数,如果对于一个数$i$,$b_{1i}=b_{2i}$,则不考虑这个点,因为肯定不会动这个点的。接下来对点染色,如果$b_{1i}≠b_{2i}$,考虑$r$数组,如果$r_{1i}≠r_{2i}$,则在$b_{1i}$和$b_{2i}$之间连一条权为0的边表示,两点染的色必须相同。反之,连一条权为$1$的边,表示两个点颜色相反,最后从每个点开始$dfs$经行染色即可,注意每次比对将开头的那个点染成$1$还是$0$,最后的结果会最优(即最少)。 | ||
=====团队训练===== | =====团队训练===== | ||
2020.7.18 [[牛客多校第三场]] | 2020.7.18 [[牛客多校第三场]] |