[关闭]
@zhshh 2018-07-13T09:18:55.000000Z 字数 1319 阅读 1045

并查集

@zhshh OI cpp others


洛谷 P3367 【模板】并查集

  1. #include <iostream>
  2. #define MX 10010
  3. using namespace std;
  4. int fa[MX];
  5. int n,m;
  6. int find(const int x){
  7. return fa[x]==x?x:fa[x]=find(fa[x]);
  8. }
  9. void un(const int x,const int y){
  10. fa[find(x)]=find(y);
  11. }
  12. int main(){
  13. cin>>n>>m;
  14. int ope,x,y;
  15. for(int i=1;i<=n;i++){
  16. fa[i]=i;
  17. }
  18. for(int i=1;i<=m;i++){
  19. cin>>ope>>x>>y;
  20. if(ope==1){
  21. un(x,y);
  22. }else{
  23. cout<<"NY"[find(x)==find(y)]<<endl;
  24. }
  25. }
  26. }

当然由于并查集肯定不可能专门去考(除了17年那种等等)
可以写到一个结构体/类(struct/class)方便应用。

  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <cmath>
  4. #include <cstring>
  5. #include <cstdio>
  6. using namespace std;
  7. struct node{
  8. int x,y;
  9. } a[55];
  10. int n;
  11. struct uf{//并查集
  12. int fa[100];
  13. int find(int x){
  14. return fa[x]==x?x:fa[x]=find(fa[x]);
  15. }
  16. void un(int x,int y){
  17. fa[(find(x))]=find(y);
  18. }
  19. void init(){//初始化
  20. for(int i=1;i<=n;i++){
  21. fa[i]=i;
  22. }
  23. }
  24. bool all(){//是否只有一个根节点,返回true时为只有一个
  25. for(int i=1;i<=n;i++){
  26. if(find(1)!=find(i)){
  27. return false;
  28. }
  29. }
  30. return true;
  31. }
  32. }f;
  33. int operator *(node a,node b){//为了方便,定义一个两点距离公式。。。
  34. return (abs(a.x-b.x)+abs(a.y-b.y));
  35. }
  36. int check(int x){
  37. f.init();
  38. for(int i=1;i<=n;i++) {
  39. for(int j=1;j<=n;j++){
  40. int dis= a[i]*a[j];
  41. if(dis<=x*2){
  42. f.un(i,j);
  43. }
  44. }
  45. }
  46. return !f.all() ;
  47. }
  48. int search(){
  49. int left=0;
  50. int right=0x7fffffff;
  51. int mid;
  52. int ans;
  53. while(left<=right){
  54. mid=(left+right)/2;
  55. if(check(mid)){
  56. left=mid+1;
  57. ans=mid;
  58. }else{
  59. right=mid-1;
  60. }
  61. }
  62. return ans+1;
  63. }
  64. void init(){
  65. cin>>n;
  66. for(int i=1;i<=n;i++){
  67. scanf("%d%d",&a[i].x,&a[i].y);
  68. }
  69. }
  70. void work(){
  71. cout<<search();
  72. }
  73. int main(){
  74. init();
  75. work();
  76. return 0;
  77. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注