大招秒杀

本文深入探讨了并查集的实现原理与使用方法,并通过实例展示了其在解决实际问题中的强大能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 typedef struct ufset *UFset;
 4 struct ufset
 5 {
 6     int parent[100001];
 7     int root[100001];
 8 }UFS;
 9 int UFfind(int e,UFset U)
10 {
11     int i,j=e;
12     while(U->root[j]==0)
13     {
14         //printf("parent[%d]=%d root=%d\n",j,U->parent[j],U->root[j]);
15         j=U->parent[j];
16     }
17     while(j!=e)
18     {
19         i=U->parent[e];
20         U->parent[e]=j;
21         e=i;
22     }
23     return j;
24 }
25 int UFunion(int i,int j,UFset U)
26 {
27     if(U->parent[i]<U->parent[j])
28     {
29         U->parent[j]+=U->parent[i];
30         U->root[i]=0;
31         U->parent[i]=j;
32         return j;
33     }
34     else
35     {
36         U->parent[i]+=U->parent[j];
37         U->root[j]=0;
38         U->parent[j]=i;
39         return i;
40     }
41 }
42 int main()
43 {
44     UFset UF;
45     UF=(UFset)malloc(sizeof(UFS));
46     int e,n,m,k,x,i,a,b,t1,t2;
47     scanf("%d %d %d",&n,&m,&k);
48     for(e=1;e<=n+1;e++)
49     {
50         UF->parent[e]=1;
51         UF->root[e]=1;
52     }
53     for(i=0;i<m;i++)
54     {
55         scanf("%d %d",&a,&b);
56         t1=UFfind(a,UF);t2=UFfind(b,UF);
57         if(t1!=t2)
58         {
59             UFunion(t1,t2,UF);
60         }
61     }
62     for(i=0;i<k;i++)
63     {
64         scanf("%d",&x);
65         printf("%d\n",UF->parent[UFfind(x,UF)]);
66     }
67     return 0;
68 }
View Code

并查集简单又好用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值