BZOJ1562: [NOI2009]变换序列(二分图 匈牙利)
Description
Input
Output
Sample Input
1 1 2 2 1
Sample Output
HINT
30%的数据中N≤50;
60%的数据中N≤500;
100%的数据中N≤10000。
Source
这题是二分图应该不难看出来。
对于原序列中的一个点,对应两个可匹配的点。
关键是怎么保证字典序最小
如果是暴力删边+匈牙利的话是$O(n^3)$的。
这里有两种解决方法:
1.强制让$x$号点连向字典序小的点,对失配的点重新匹配
2.将所有边按照字典序排序,优先选择最小的。
同时在匈牙利的时候从最大的往最小的枚举
这实际上利用了匈牙利“抢” 的思想。
如之前的已经匹配过,那么字典序小的会抢字典序大的匹配。同时又因为每次选的是字典序最小的。因此答案可以保证是最优的。
#include<cstdio> #include<vector> #include<algorithm> #include<cstring> const int INF = 1e9 + 10, MAXN = 1e5 + 10; using namespace std; inline int read() {char c = getchar(); int x = 0, f = 1;while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();return x * f; } int N; int a[MAXN]; int match[MAXN], vis[MAXN], cur; vector<int> v[MAXN]; void AddEdge(int x, int y) {v[x].push_back(y); v[y].push_back(x); } bool Argue(int x) {for(int i = 0; i < v[x].size(); i++) {int to = v[x][i];if(vis[to] == cur) continue;vis[to] = cur; if(match[to] == -1 || Argue(match[to])) {match[to] = x;return true;}}return false; } void Hug() {int ans = 0;for(int i = N - 1; i >= 0; i--) {cur++;if(!Argue(i)) {printf("No Answer"); exit(0);}} for(int i = 0; i < N; i++) match[match[i + N]] = i;for(int i = 0; i < N; i++) printf("%d ", match[i]); } main() { #ifdef WIN32freopen("a.in", "r", stdin);freopen("a.out", "w", stdout); #endifmemset(match, -1, sizeof(match));N = read();for(int i = 0; i < N; i++) {int x = read();AddEdge(i, (i + x) % N + N);AddEdge(i, (i - x + N) % N + N);}for(int i = 0; i < N << 1; i++) sort(v[i].begin(), v[i].end());Hug(); }
BZOJ1562: [NOI2009]变换序列(二分图 匈牙利)相关推荐
- bzoj1562 [NOI2009]变换序列
bzoj1562 [NOI2009]变换序列 NOI也有SB题系列. 一个\(i\)只有两种可能的\(T_i\) 要求所有\(T_i\)不重复,且字典序坠小. 仔细想一想匈牙利匹配的过程就可以知道:要 ...
- bzoj1562[NOI2009] 变换序列
题目链接:bzoj1562 题目大意: 给出一个序列(0~n-1),这个序列经过某个变换会成为另外一个序列,但是其中的元素不会改变,给出初始序列与变换后的序列每一位上的"距离",求 ...
- bzoj1562[NOI2009]变换序列——2016——3——12
任意门:http://www.lydsy.com/JudgeOnline/problem.php?id=1562 题目: 对于0,1,-,N-1的N个整数,给定一个距离序列D0,D1,-,DN-1,定 ...
- bzoj 1562 [NOI2009]变换序列 二分图
题面 题目传送门 解法 显然可以构建一个二分图模型 但是要求出字典序最小的解,那么网络流就无能为力了 考虑用匈牙利算法来跑 匈牙利算法就是用大的来代替小的,那我们把连接的点从小到大排序,然后从左边大的 ...
- P1963 [NOI2009]变换序列
题目描述 不想水字,详见某谷:P1963 [NOI2009]变换序列 solution 其实 的计算就类似于环上的距离. 对于每一个 都可能有两种位置选择:, . 所以把它们分别连边,二分图上 ...
- 1562. [NOI2009]变换序列【二分图】
Description Input Output Sample Input 5 1 1 2 2 1 Sample Output 1 2 4 0 3 HINT 30%的数据中N≤50: 60%的数据中N ...
- [NOI2009] 变换序列 (匈牙利最大匹配)
description - solution 我竟然一眼题!! 变换后的TTT数组是[0,n)[0,n)[0,n)的排列,变换规则也有,距离DDD也知道 很明显可以求出iii的可能变换对象 这不就是个 ...
- 【二分图匹配】BZOJ1562-[NOI2009] 变换序列
[题目大意] 对于0,1,-,N-1的N个整数,给定一个距离序列D0,D1,-,DN-1,定义一个变换序列T0,T1,-,TN-1使得每个i,Ti的环上距离等于Di.一个合法的变换序列应是0,1,-, ...
- 二分图-匈牙利算法模板
二分图就不赘述了,我在知识资料整理有相关资料. .最大匹配 .最小路径覆盖 .最小点覆盖 .最大独立集 最大匹配:二分图中边集最大的那个匹配 最小路径(边)覆盖:用尽量小的不想交简单路径覆盖有向 ...
最新文章
- 2022-2028年中国高等职业教育产业投资分析及前景预测报告
- 西安翻译学院计算机分数线,西安翻译学院录取投档线
- 说说进程与线程的区别与联系
- eclipse配置struts.xml自动提示
- Java性能优化推荐书!RocketMQ消息丢失场景及解决办法
- 后端生成Token架构与设计详解
- 什么导致了交换机端口呈现err-disable状态?
- SHELL脚本之自动化安装通用二进制格式MariaDB
- android 隐藏所有 fragment,Android 隐藏Fragment
- 并行开发 4.同步机制(上)
- rpgmakermv导出html,RpgMaker MV 插件基础(一)
- Micrium uC-Probe导入.elf文件的问题
- 基于superslide的导航栏 效果切换
- linux中无损gpt转mbr,如何快速实现免重装无损磁盘MBR转GPT?
- android canvas 画圆边缘模糊,Android canvas画圆
- Jim Keller:在指令集上辩论是一件悲哀的事情
- java虚拟机有哪些分类?
- 简单好玩经典有趣的微信小游戏
- 用 C# 编写 USB 存储设备使用痕迹检测和删除工具
- 小程序上拉加载onReachBottom不触发
热门文章
- Filter案例之登录验证
- 记一次Hbase数据迁移和遇到的问题
- Java和.NET(C#)的开发用到的技术对比总结
- BZOJ4516: [Sdoi2016]生成魔咒
- Wpf Binding.Path设置
- 程序日志--要养成好习惯
- HDU 2818 Building Block
- object的classid收集
- Django实战(1):需求分析和设计
- java replaceall函数_JAVA中string.replace和string.replaceAll的区别及用法