合并-查找接口实现

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 }

 

posted on 2018-03-26 10:53  MACHINE_001  阅读(423)  评论(0编辑  收藏  举报

导航