并查集模板

并查集模板

题目链接1

题目链接2

题目链接3

 

代码:

1.

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 using namespace std;
 6 int fa[1000050],n,m;
 7 int f(int x)
 8 {
 9     if(fa[x]==x) return x;
10     else fa[x]=f(fa[x]);
11     return fa[x];
12 }
13 void unionn(int x,int y)
14 {
15     fa[f(x)]=f(y);
16 }
17 int main()
18 {
19     int x,y,b;
20     scanf("%d%d",&n,&m);
21     for(int i=1;i<=n;i++)
22     fa[i]=i;
23     for(int i=1;i<=m;i++)
24     {
25         scanf("%d%d%d",&b,&x,&y);
26         if(b==1)
27         unionn(x,y);
28         else{
29             if(f(x)==f(y)) printf("Y\n");
30             else printf("N\n");
31         }
32     }
33     return 0;
34 } 

 

2.

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 using namespace std;
 6 int fa[5050],n,m,p;
 7 int f(int x)
 8 {
 9     if(fa[x]==x) return x;
10     else fa[x]=f(fa[x]);
11     return fa[x];
12 }
13 void unionn(int x,int y)
14 {
15     fa[f(x)]=f(y);
16 }
17 int main()
18 {
19     int x,y;
20     scanf("%d%d%d",&n,&m,&p);
21     for(int i=1;i<=n;i++)
22     fa[i]=i;
23     for(int i=1;i<=m;i++)
24     {
25         scanf("%d%d",&x,&y);
26         unionn(x,y);
27     }
28     while(p--)
29     {
30         scanf("%d%d",&x,&y);
31         if(f(x)==f(y)) printf("Yes\n");
32         else printf("No\n");
33     }
34     return 0;
35 } 

 

 

3.

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 using namespace std;
 5 int n,m,fat[5005],i,k,tot,x,y,z;
 6 struct e{
 7     int x,y,v;
 8 } a[200050];
 9 int find(int x)
10 {
11     if(fat[x]==x) return x;
12     else fat[x]=find(fat[x]);
13     return fat[x];
14 }
15 void unionn(int x,int y)
16 {
17     int fa=find(x),fb=find(y);
18     fat[fa]=fb;
19 }
20 bool cmp(const e &x,const e &y)
21 {
22     return x.v<y.v;
23 }
24 int main()
25 {
26     cin>>n>>m;
27     for(i=1;i<=m;i++)
28     a[i].v=0x7ffffff;
29     for(i=1;i<=m;i++)
30     cin>>a[i].x>>a[i].y>>a[i].v;
31     sort(a+1,a+1+m,cmp);
32     for(i=1;i<=n;i++) fat[i]=i;
33     for(i=1;i<=m;i++)
34     {
35         if(find(a[i].x)!=find(a[i].y))
36         {
37             unionn(a[i].x,a[i].y);
38             tot+=a[i].v;
39             k++;
40             if(k==n-1) break;
41         }
42     }
43     if(k<n-1)
44     {
45         cout<<"orz"<<endl;
46         return 0;
47     }
48     cout<<tot<<endl;
49     return 0;
50 }

 

 

posted @ 2018-03-02 20:27  yjk  阅读(171)  评论(0编辑  收藏  举报