• 合并-查找接口实现


    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
    ",p, q);
    17         }
    18         */
    19     while(scanf("%d %d", &p, &q)==2)
    20     {
    21         if(UFunion(p, q))
    22         {
    23             printf("%d %d
    ",p, q);
    24         }
    25     }
    26     //printf("%d",UFnum(0, N));
    27     return 0;
    28 }
  • 相关阅读:
    [07] Redis 持久化
    [06] Redis 事务
    [05] Jedis
    [04] Redis 配置文件
    [03] Redis 数据类型
    [02] Redis 简介&安装
    [01] NoSQL 简介
    06-NULL&typedef
    05-动态内存分配
    朴素贝叶斯分类器Naive Bayes
  • 原文地址:https://www.cnblogs.com/WALLACE-S-BOOK/p/8649500.html
Copyright © 2020-2023  润新知