#ACW 4084 号码牌(无向图连通性+简单拓扑序)
1.题意
链接: 原题链接.
给你一个1~n全排列A,让你判断能否通过一种操作使之变为目标排列B。该操作是:交换与当前下标i相距did_idi的2个元素。
如:下标为5,d5=2d_5=2d5=2,那么可以将下标为5处的元素和下标为3或7处的元素交换。
2.思路
从图的角度思考,假如下标为a处可以到达下标为b处,那么就从a向b连一条有向边,我们发现交换是相互的,故可以把这条有向边改成无向边。
我们进一步发现想让下标为i的数变为aia_iai,而aia_iai在下标j,那么只要从i到j有路径就可以了。
那么是否只要对于每个下标i,其与目标排列的aia_iai所在下标j间连通,就一定存在一种合理交换方案得到目标排列?
答案是肯定的,构造方法类似于拓扑排序,在每个连通块中,先找到度为1的点,把对应元素移动过去,然后去掉唯一的一条边,循环进行,可得出一定有解。(一个连通块,按照topo序删点,剩下的模块依旧是一个连通块)
由于本题只需要判断真假,故只需要判断目标下标和原下标的连通性即可,这可以使用并查集或者floodfill算法,如下代码用的是后者。(啊,,比赛的时候并查集都忘了该咋写了~)
3.代码
#include <iostream>using namespace std;const int N=110;bool g[N][N];
int n;
int a[N],d[N],con[N];
bool st[N];
int cnt;void dfs(int u)
{st[u]=true;con[u]=cnt;for(int i=0;i<n;i++){if(g[u][i]&&!st[i]){dfs(i);}}return;
}void floodfill()
{for(int i=0;i<n;i++){if(!st[i]){cnt++;dfs(i);}}
}bool check()
{for(int i=0;i<n;i++)if(con[a[i]-1]!=con[i])return false;return true;
}int main()
{cin>>n;for(int i=0;i<n;i++)cin>>a[i];for(int i=0;i<n;i++)cin>>d[i];for(int i=0;i<n;i++){if(d[i]+i<n){g[i][i+d[i]]=1;g[i+d[i]][i]=1;}if(i-d[i]>=0){g[i][i-d[i]]=1;g[i-d[i]][i]=1;}}floodfill();if(check())cout<<"YES\n";else cout<<"NO\n";}
4.收获
- 当遇到比较复杂的题目,考虑用图论的角度思考问题
- 拓扑序的优秀性质——一个连通块,按照topo序删点,剩下的模块依旧是一个连通块。诶呦,不错哟~
#ACW 4084 号码牌(无向图连通性+简单拓扑序)相关推荐
- 4084 号码牌(并查集)
1. 问题描述: 有 n 个小朋友,编号 1∼n.每个小朋友都拿着一个号码牌,初始时,每个小朋友拿的号码牌上的号码都等于其编号.每个小朋友都有一个幸运数字,第 i 个小朋友的幸运数字为 di.对于第 ...
- 错题本 (并查集) acwing 4084.号码牌
题目链接 题目描述 有 nnn 个小朋友,编号 1∼n1∼n1∼n. 每个小朋友都拿着一个号码牌,初始时,每个小朋友拿的号码牌上的号码都等于其编号. 每个小朋友都有一个幸运数字,第 iii 个小朋友的 ...
- 0x66.图论 - Tarjan算法与无向图连通性
目录 一.无向图的割点与桥 割点 桥/割边 时间戳 搜索树 追溯值 二.割边判定法则 三.割点判定法则 1.luogu P3388 [模板]割点(割顶) 2.luogu P3469 [POI2008] ...
- word快速制作多个单面桌签、号码牌等
很多时候,我们需要制作多个桌签.号码牌等,如果一个单独添加,数量少的情况下能很快完成,如果有成百上千个,那么就比较麻烦了,现在又简单的方法就是通过word中合并邮件功能来完成,具体如下: 1.新建ex ...
- AcWing4084 号码牌 (并查集 / bitset优化Floyd)
题目链接: 号码牌 大致题意 给定一个长度为nnn的序列, 第iii个位置的值为aia_iai. (保证aaa是111~nnn的一个排列) 每个位置还有一个值did_idi, 若满足∣i−j=di ...
- 来自wzc的简单拓扑dp
来自wzc的简单拓扑dp(拓扑DP) 题目已经把解决方案给你了,就是拓扑DP(出题人这回没有耍你,真的) 不过我还是莽了两发dijk贪心QAQ,果然错了(毕竟DP弱者,巨贪心)- 正片开始 有向图拓扑 ...
- 来自wzc的简单拓扑dp———浙江农林大学第二十届程序设计竞赛暨团体程序设计天梯赛选拔赛(同步赛)
传送门 题目描述 (良心出题人wzc说这是个简单拓扑dp,它就必然是一个简单拓扑dp,wzc是不会骗人的) wzc在一张拓扑图上,他所在的起始位置被标记为0.除了起始位置外,还有被1到n这n个整数所标 ...
- 关于标识牌的一些简单介绍
酒店标识牌设计,简单地说就是有字或图案的牌子.详细点说,可定义为在不同的时空环境.不同区域,采取立.挂.吊.粘等安装方式的有一定制作标准的质地多样化的通过文字表达方位功能或信息功能的牌子. 标牌以材质 ...
- 字典序最小是什么意思_《拓扑序简介》第十六讲
这是民科+大忽悠+地摊报告,我准备把拓扑序吹成天上有地上无.人见人爱.老幼咸宜.不买会后悔的什么东西.珍惜青春,珍惜钱包,请大家谨慎对待大忽悠.下面是回放视频的链接. 蔻享--共享科学.传播科学ww ...
最新文章
- 【互联网面试】朋友圈问题
- 怎么提高面试成功率?
- Linux性能测试 ss命令
- LeetCode Non-overlapping Intervals(dp,greedy)
- linux find 命令详解
- 15 个必须知道的 Chrome 开发工具技巧
- python合法变量类型_Python 变量类型
- 实例讲解——系统登录
- 扫描式SSD用于公式检测,代码已开源
- 抖音上线独立电商APP“抖音盒子”
- HashMap在Jdk1.7和1.8中的实现
- String 转Clob
- 发现eclipse红叉,查看markers发现Target runtime Apache Tomcat 6.0 is not defined
- ubuntu 安装opensips osip exosip
- 中国5G牌照或于今日发放 我国将正式进入5G时代
- python数据分析练手小项目-汽车销售偷漏纳税人识别
- 21cn邮箱服务器,21cn邮箱客户端
- 微软搜索战略全盘革新 计划数月内发布“Kiev”
- 【算法】最短路径之Bellman-Ford
- HFSS15 win10_64位破解
热门文章
- 网易魔兽怀旧服服务器型号,《魔兽世界》经典怀旧服服务器大盘点
- 2018.8.21 广州科目三展茂东满分飘技巧
- 2020年秋招回顾总结(2021届),目前已在上海入职工作,感恩亲人与朋友,未来,你好!
- 参加SODA数据比赛
- 已知有十六支男子足球队参加2008 北京奥运会。 写一个程序,把这16 支球队随机分为4 个组,每组4只球队。采用List集合和随机数。
- 如何给TSM磁带机添加新磁带
- WIN10系统文件加密(纯手工技巧,非代码类)
- 自主研发项目七之学生电子班牌系统
- pandas中如何提取DataFrame的某些列
- 卸载 x 雷某度!GitHub 标星 1.5w+,从此我只用这款全能高速下载工具Motrix!