1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
#include<stdio.h> int tree[1000];
int find(int x) { return tree[x]==x?x:find(tree[x]); }
void uset(int a, int b) { a=find(a); b=find(b); if(a==b) return ; tree[b]=a; }
int main() { int n,i,m,a,b; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) tree[i]=i; for(i=0;i<m;i++) { scanf("%d%d",&a,&b); uset(a,b); } scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d%d",&a,&b); if(find(a)==find(b)) printf("YES\n"); else printf("NO\n"); } return 0; }
加入按秩合并
(减少递归的层数)按秩合并:把秩(高度)小的根合并到秩大的根上。如果高度相同则树的高度增加1,如果 高度小的连到高度大的根上,则树的高度不变
#include<stdio.h> int tree[1000];
int find(int x) { return tree[x]<0?x:find(tree[x]); }
void uset(int a, int b) { if((a=find(a)) == (b=find(b))) return ; if(tree[a]<tree[b]) tree[b]=a; else if(tree[a]>tree[b]) tree[a]=b; else { tree[a]=b; tree[b]--; } }
int main() { int n,i,m,a,b; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) tree[i]=-1; for(i=0;i<m;i++) { scanf("%d%d",&a,&b); uset(a,b); } scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d%d",&a,&b); if(find(a)==find(b)) printf("YES\n"); else printf("NO\n"); } return 0; }
加入压缩路径
压缩路径:查找过的节点都直接连到根上,降低树的高度,所以递归查找时深度遍历的 层数降低了,所以越用越快
#include<stdio.h> int tree[1000];
int find(int x) { return tree[x]<0?x:(tree[x]=find(tree[x])); }
void uset(int a, int b) { if((a=find(a))==(b=find(b))) return ; if(tree[a]<tree[b]) tree[b]=a; else if(tree[a]>tree[b]) tree[a]=b; else { tree[a]=b; tree[b]--; } }
int main() { int n,i,m,a,b; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) tree[i]=-1; for(i=0;i<m;i++) { scanf("%d%d",&a,&b); uset(a,b); } scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d%d",&a,&b); if(find(a)==find(b)) printf("YES\n"); else printf("NO\n"); } return 0; }
|