如果使用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])。
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:689 |
钟神赛车 (C++代码)浏览:905 |
【密码】 (C语言代码)浏览:350 |
C语言程序设计教程(第三版)课后习题8.3 (C语言代码)浏览:1110 |
用筛法求之N内的素数。 (C语言代码)浏览:685 |
【矩阵】 (C++代码)浏览:999 |
剪刀石头布 (C语言代码)浏览:1519 |
C语言程序设计教程(第三版)课后习题12.3 (C语言代码)浏览:587 |
C语言程序设计教程(第三版)课后习题12.6 (C语言代码)浏览:732 |
C语言程序设计教程(第三版)课后习题7.3 (C语言代码)浏览:420 |