UF.h (初始化,查找,合并接口)
1 void UFinit(int); 2 //int UFfind(int, int); 3 int UFunion(int, int); 4 int UFnum(int, int);
UF.c (接口实现)
1 #include<stdlib.h> 2 #include "UF.h" 3 4 typedef struct 5 { 6 int *id,*sz; 7 }id_sz; 8 static id_sz ID; 9 void UFinit(int N) 10 { 11 ID.id=malloc(N*sizeof(int)); 12 ID.sz=malloc(N*sizeof(int)); 13 for(int i=0; i<N; i++) 14 { 15 ID.id[i]=i; 16 ID.sz[i]=1; 17 } 18 } 19 static int find(int x) 20 { 21 while(x!=ID.id[x]) 22 { 23 ID.id[x]=ID.id[ID.id[x]]; 24 x=ID.id[x]; 25 } 26 return x; 27 } 28 29 /* 30 int UFfind(int p, int q) 31 { 32 return (find(p)==find(q)); 33 } 34 35 void UFunion(int p, int q) 36 { 37 int i=find(p),j=find(q); 38 if(i==j) return; 39 if(sz[i]<sz[j]) 40 { 41 id[i]=j; 42 sz[j]+=sz[i]; 43 } 44 else 45 { 46 id[j]=i; 47 sz[i]+=sz[j]; 48 } 49 }*/ 50 int UFunion(int p, int q) 51 { 52 int i=find(p),j=find(q); 53 if(i==j) return 0; 54 if(ID.sz[i]<ID.sz[j]) 55 { 56 ID.id[i]=j; 57 ID.sz[j]+=ID.sz[i]; 58 } 59 else 60 { 61 ID.id[j]=i; 62 ID.sz[i]+=ID.sz[j]; 63 } 64 return 1; 65 } 66 67 int UFnum(int p, int N) 68 { 69 int k=N-1,i=k,num=0; 70 71 //while(p!=id[p]) 72 //p=id[p]; 73 p=find(p); 74 while(k>=0) 75 { 76 //while(i!=id[i]) 77 //i=id[i]; 78 i=find(i); 79 if(p==i)num++; 80 i=--k; 81 } 82 return num--; 83 }
main.c (主程序)
1 #include <stdio.h> 2 #include "UF.h" 3 4 int main(void) 5 { 6 int p,q,N; 7 8 scanf("%d",&N); 9 getchar(); 10 11 UFinit(N); 12 /* while(scanf("%d %d", &p, &q)==2) 13 if(!UFfind(p, q)) 14 { 15 UFunion(p, q); 16 printf("%d %d\n",p, q); 17 } 18 */ 19 while(scanf("%d %d", &p, &q)==2) 20 { 21 if(UFunion(p, q)) 22 { 23 printf("%d %d\n",p, q); 24 } 25 } 26 //printf("%d",UFnum(0, N)); 27 return 0; 28 }