题解 [蓝桥杯 2016 省 B] 交换瓶子
本题解讲解环图的做法。
要将一个 的排列通过交换变成 ,可以先将 向 连边,那么最终一定会练成若干个环(每个点只有一个出度,也只有一个入度)。
假设交换在同一个环中的节点,一个环显然会变成两个环,也就是说,交换一次最多增加一个环的数量,那么最终要求显然是 个环的情况,即 个自环,求出环的数量 ,答案就是 。
代码:
const int N=11000; int n,a[N],to[N],vis[N]; int main() { cin>>n; for(int i=1;i<=n;i++) { int x; cin>>x; to[i]=x; } int ans=0; for(int i=1;i<=n;i++) { if(vis[i]) continue; ans++; for(int j=i;!vis[j];j=to[j]) { vis[j]=1; } } cout<<n-ans; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效