当前位置:   article > 正文

图论:判断环的个数_n个点的环的数量

n个点的环的数量

背景:给定若干个节点,每个节点都指向另一个节点或者指向自己,判断这若干个点形成的环的个数

注意:勿要认为是求连通块问题,因为环中各点形成的结构是没有出口的,没有根节点

例题:

                                                acwing 1224.交换瓶子

有 N个瓶子,编号 1∼N,放在架子上。

比如有 5个瓶子:

2 1 3 5 4

要求每次拿起 2 个瓶子,交换它们的位置。

经过若干次后,使得瓶子的序号为:

1 2 3 4 5

对于这么简单的情况,显然,至少需要交换 2 次就可以复位。

如果瓶子更多呢?你可以通过编程来解决。

输入格式

第一行包含一个整数 N,表示瓶子数量。

第二行包含 N 个整数,表示瓶子目前的排列状况。

输出格式

输出一个正整数,表示至少交换多少次,才能完成排序。

数据范围

1≤N≤10000,

输入样例1:

  1. 5
  2. 3 1 2 5 4

输出样例1:

3

输入样例2:

  1. 5
  2. 5 4 3 2 1

输出样例2:

2
代码:
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. const int N=10010;
  7. int a[N];
  8. bool st[N];
  9. int n;
  10. int main()
  11. {
  12. scanf("%d",&n);
  13. for(int i=1;i<=n;i++) scanf("%d",&a[i]);
  14. int cnt=0;
  15. for(int i=1;i<=n;i++)
  16. {
  17. if(st[i]) continue;
  18. cnt++;
  19. for(int j=i;!st[j];j=a[j]) st[j]=true;
  20. }
  21. printf("%d\n",n-cnt);
  22. return 0;
  23. }

 解释:

让每个节点指向它们应该放置的位置,由此形成若干个环。

经过模拟可以发现,由n个节点构成的环中,至少交换n-cnt次就可以使得环中各个节点放置在正确的位置,并且消除掉这个环。

因此节点总数-环的数量就是应该交换的次数。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/64573
推荐阅读
相关标签
  

闽ICP备14008679号