欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

合并-查找接口实现

程序员文章站 2022-04-15 20:08:30
UF.h (初始化,查找,合并接口) UF.c (接口实现) main.c (主程序) ......

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 }