如果使用unordered_map来替代数组来实现并查集的话,速度反而慢了。 #include <bits/stdc++.h> using namespace std; unordered_map<int,int> mp; int find(int x){ if(mp.count(x)) mp[x]=find(mp[x]); else{ mp[x]=x+1; return x; } return mp[x]; } int main(){ int n; cin>>n; vector<int> arr(n); for(int i=0;i<n;i++){ cin>>arr[i]; } for(int i=0;i<n;i++){ if(!mp.count(arr[i])) mp[arr[i]]=arr[i]+1; else{ arr[i]=find(arr[i]); } } for(int i=0;i<arr.size();i++) cout<<arr[i]<<" "; return 0; }
查找祖宗结点函数部分,为什么换成其他的书写方式就运行超时了呢?为什么这样的书写方式直接默认了路径压缩呢?(其他的都需要额外写一部分路径压缩的代码) 比如,改成如下这种形式就会提示超时,这又跟您的代码有什么区别呢? int find(int x ) { while(x!=find(x)) { x=find(x); } return x; }
为什么它包含iostream头文件还可以用scanf()和printf()
陌 2021-04-18 00:18:46 |
这个是在别的网站的,他在后台自动加上 C 语言的标准输入输出了。如果出错也可以自己加上哈
你这代码好像没有路径压缩啊
-. 2021-02-19 22:29:40 |
find 函数在找到根后,返回了根节点,所有的节点就都指向了根节点。思想体现在这里: p[x] = find(p[x]); 而不是 find(p[x])。
A+B for Input-Output Practice (IV) (C语言代码)浏览:484 |
C语言程序设计教程(第三版)课后习题6.3 (C++代码)浏览:1067 |
字符逆序 (C语言代码)浏览:506 |
【亲和数】 (C语言代码)浏览:628 |
C语言程序设计教程(第三版)课后习题10.2 (C语言代码)浏览:755 |
C二级辅导-统计字符 (C语言代码)浏览:514 |
C语言训练-列出最简真分数序列* (C语言代码)浏览:658 |
C语言程序设计教程(第三版)课后习题11.3 (C语言代码)浏览:2207 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:725 |
母牛的故事 (C语言代码)浏览:495 |