好题,好题,第一次写这个神秘的拆环。。
题意:
给你n个数,第i个数代表点i连向点a[i],
将这副图变成树,求最小改变边的数量;
思路:
已知有向树的定义,
除了根节点外每个节点都有且仅有一条边都指向它的父亲节点,
而根节点有且仅有一条边指向自己。
给出的图类型,
1.环;
2.独立的点;
3.链;
如果是独立的话,就是选定一个根节点然后,让其他根节点指向它;
如果存在环的话,那么就是拆掉,选一个根结点。
//存在自己指向自己,也就是根,如果存在自己指向自己就可以让树的根设为其中一个。
//拆环具体操作,找链,标记,最后判断break出来的节点是否也是cnt

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=2e5+10;
vector<int>pp;
int n;
int a[N];
int vis[N];
bool v[N];int main()
{pp.clear();memset(v,false,sizeof(v));scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);if(a[i]==i){pp.push_back(i);v[i]=true;}}int num=pp.size();memset(vis,-1,sizeof(vis));int cnt=0;int pre,x;for(int i=1;i<=n;i++){if(vis[i]==-1){cnt++;x=i;while(vis[x]==-1){vis[x]=cnt;pre=x;x=a[x];}if(vis[x]==cnt)//存在环,拆环{a[pre]=pre;}}}for(int i=1;i<=n;i++){if(a[i]==i&&!v[i])pp.push_back(i);}for(int i=1;i<pp.size();i++){a[pp[i]]=pp[0];}if(num)cout<<pp.size()-1<<endl;elsecout<<pp.size()<<endl;for(int i=1;i<=n;i++){if(i!=1)printf(" ");printf("%d",a[i]);}return 0;
}

转载于:https://www.cnblogs.com/keyboarder-zsq/p/5934757.html

Codeforces698B【并查集+拆环】相关推荐

  1. Ice_cream's world I HDU - 2120(并查集判环)

    题意:问给出的望塔之间的建造了围墙,将土地分成了几份 思路:用并查集判环,若有围墙相接的瞭望塔,有相同的父根,则存在环 ice_cream's world is a rich country, it ...

  2. Codeforces 103B - Cthulhu(并查集 找环和块)

    传送门:https://codeforces.com/problemset/problem/103/B 题意: 给一个n个结点,m条边的无向图 判断给定图是否满足以下条件: 能被表示为有3个及以上的有 ...

  3. BZOJ 1370: [Baltic2003]Gang团伙 [并查集 拆点 | 种类并查集WA]

    题意: 朋友的朋友是朋友,敌人的敌人是朋友:朋友形成团伙,求最多有多少团伙 种类并查集WA了一节课,原因是,只有那两种关系才成立,诸如朋友的敌人是朋友之类的都不成立! 所以拆点做吧 #include ...

  4. LA3644简单并查集判环

    题意:       有n个化合物,每个化合物是两种元素组成,现在要装车,但是一旦车上的化合物中的某几个化合物组成这样一组关系,有n个化合物正好用了n中元素,那么就会爆炸,输入的顺序是装车的顺序,对于每 ...

  5. poj 3310(并查集判环,图的连通性,树上最长直径路径标记)

    题目链接:http://poj.org/problem?id=3310 思路:首先是判断图的连通性,以及是否有环存在,这里我们可以用并查集判断,然后就是找2次dfs找树上最长直径了,并且对树上最长直径 ...

  6. 巧用并查集求解环的个数以及连通块的数目

    2021年度训练联盟热身训练赛第二场--F题:Interstellar Love 题意 给你s个点,c个连接数,求解这s个点组成的连通块的数量以及其中所包含的环的数量(孤立的点不算作连通块和环). 思 ...

  7. 【HDU - 1272】小希的迷宫 (并查集判环)

    题干: 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通 ...

  8. 并查集(Union-Find)

    并查集(Union-Find) 并查集(Union-Find) 1.初始化 2.查询 3.合并 4.平衡性优化,扁平化 5.按秩合并 6.路径压缩 7.代码 常用模板 [★ 547. 省份数量](ht ...

  9. 【洛谷 P7299】 【并查集】 Dance Mooves S

    [洛谷 P7299] [并查集] Dance Mooves S 题目 解题思路 可以先求出k轮后i能到达next[i] 可以发现将会组成由很多个简单环组成的图,它们能到达的点可以共享给同一个环内的 所 ...

最新文章

  1. 抗击新冠肺炎,如何进行实时动态时序图谱建模与分析?
  2. 最大的ai计算机模型,Microsoft构建了世界排名前五的超级计算机,用于在Azure上训练大型AI模型...
  3. Python list排序
  4. html js点击字图片下拉,JavaScript实现文字与图片拖拽效果的方法
  5. 如何用css将超出部分变成...
  6. mac 通过 homebrew 安装mongodb
  7. 【音乐】想不起来歌名的瞎唱
  8. Java零基础入门 : (2) 代码编辑器IDEA安装与配置
  9. 为什么不用小驼峰也能查到数据库数据_为什么不用驼峰命名创建表名和字段?...
  10. Jmeter设置环境变量支持在任意终端目录输入jmeter直接启动
  11. 【译】Seaborn教程(二)选择配色方案
  12. Java 输入/输出 I/O流 RandomAccessFile
  13. arcgis中python计算面积的表达式_ArcGIS应用——四种计算图斑面积的方法
  14. 写 node.js 用什么编辑器?
  15. vue组件库(Element UI)
  16. 完美tbody滚动效果
  17. “蔚来杯“2022牛客暑期多校训练营5 A:Don‘t Starve
  18. 寒假ACM假期总结 (7)
  19. AppScan渗透测试
  20. cadence中测输出功率方法

热门文章

  1. 人族机器人叉兵_星际争霸兵种体积和伤害判断:叉叉小体积为什么运输机占2单位?...
  2. li 字多出了省略号_文字溢出自动显示省略号css方法 -
  3. centos禁用exec_centos-php用exec执行Linux命令时,返回127错误码
  4. Android学习笔记篇1. 从按钮的点击事件开始
  5. spring学习记录(一)
  6. linux系统中acpid的作用,ACPID电源按钮事件本地权限提升漏洞
  7. search.php制作,重写搜索Search类
  8. java注解传递value_spring中@value注解需要注意的问题
  9. matlab 置顶曲线,matlab figure 最大,最小,置顶
  10. ipython怎么安装numpy_在TensorFlow教程中安装numpy后仍然无法导入