并查集的几道题(hdu1198)(1232)(1272)(1598)

1232模板题

View Code
 1 #include <stdio.h>
 2 #include<string.h>
 3 int father[1001];
 4 int find(x)
 5 {
 6     if(x!=father[x])
 7     father[x] = find(father[x]);
 8     return father[x];
 9 }
10 void union1(int x,int y)
11 {
12     father[x] = y;
13 }
14 int main()
15 {
16     int i,j,k,n,m,a,b;
17     while(scanf("%d",&n)&&n)
18     {
19         scanf("%d",&m);
20         int num = 0;
21         for(i = 1 ; i <= n ; i++)
22         father[i] = i;
23         for(i = 1 ; i <= m ; i++)
24         {
25             scanf("%d%d",&a,&b);
26             int px = find(a);
27             int py = find(b);
28             if(px!=py)
29             union1(px,py);
30         }
31         for(i = 1; i <= n ; i++)
32         if(father[i]==i)
33         num++;
34         printf("%d\n",num-1);
35     }
36     return 0;
37 }

1272数据貌似挺水

View Code
 1 #include <stdio.h>
 2 #include<string.h>
 3 int father[100001],k[200001];
 4 int find(int x)
 5 {
 6     if(x!=father[x])
 7     father[x] = find(father[x]);
 8     return father[x];
 9 }
10 void union1(int x,int y)
11 {
12     father[x] = y;
13 }
14 int main()
15 {
16     int i,j,a,b,px,py,g,num;
17     while(scanf("%d%d",&a,&b)!=EOF)
18     {
19         if(a==-1&&b==-1)
20         break;
21         if(a==0&&b==0)
22         {
23             printf("Yes\n");
24             continue;
25         }
26         g = 0;
27         num = 0;
28         k[g++] = a;
29         k[g++] = b;
30         for(i = 1; i <= 100001 ; i++)
31         father[i] = i;
32         int flag = 0;
33         px = find(a);
34         py = find(b);
35         if(px!=py)
36         union1(px,py);
37         while(scanf("%d%d",&a,&b)!=EOF)
38         {
39             if(a==0&&b==0)
40             break;
41             k[g++] = a;
42             k[g++] = b;
43             px = find(a);
44             py = find(b);
45             if(px!=py)
46             father[px] = py;
47             else
48             if(a!=b)
49             flag = 1;
50         }
51         for(i = 0 ; i < g ; i++)
52         if(father[k[i]]==k[i])
53         num++;
54         if(num>1)
55         flag = 1;
56         if(flag)
57         printf("No\n");
58         else
59         printf("Yes\n");
60     }
61     return 0;
62 }

hdu1198用0和1表示四个方向有没有通道 然后用并查集判联通

View Code
 1 #include <stdio.h>
 2 #include<string.h>
 3 int dis[12][4] = {{1,0,1,0},{1,0,0,1},{0,1,1,0},{0,1,0,1},{1,1,0,0},{0,0,1,1},{1,0,1,1},{1,1,1,0},{0,1,1,1},{1,1,0,1},{1,1,1,1}};
 4 int father[3001];
 5 int find(int x)
 6 {
 7     if(x!=father[x])
 8     father[x] = find(father[x]);
 9     return father[x];
10 }
11 void union1(int x,int y)
12 {
13     father[x] = y;
14 }
15 int main()
16 {
17     int i,j,k,n,m,px,py,x,y;
18     char c[51][51];
19     while(scanf("%d%d",&m,&n)!=EOF)
20     {
21         if(n<0&&m<0)
22         break;
23         int num = 0;
24         for(i = 1; i <= m ; i++)
25         {
26             getchar();
27             for(j = 1; j <= n ; j++)
28             c[i][j] = getchar();
29         }
30         for(i = 1 ; i <= n*m ; i++)
31         father[i] = i;
32         for(i = 1; i <= m ; i++)
33         {
34             for(j = 1 ; j <= n ; j++)
35             {
36                 x = c[i][j]-'A';
37                 y = c[i][j+1]-'A';
38                 if(j!=n)
39                 if(dis[x][3]==dis[y][2]&&dis[y][2]==1)
40                 {
41                     px = find((i-1)*n+j);
42                     py = find((i-1)*n+j+1);
43                     if(px!=py)
44                     union1(px,py);
45                 }
46                 if(i!=m)
47                 {
48                     y = c[i+1][j]-'A';
49                     if(dis[x][1]==dis[y][0]&&dis[y][0]==1)
50                     {
51                         px = find((i-1)*n+j);
52                         py = find(i*n+j);
53                         if(px!=py)
54                         union1(px,py);
55                     }
56                 }
57             }
58         }
59         for(i = 1 ; i <= n*m ; i++)
60         if(father[i]==i)
61             num++;
62         printf("%d\n",num);
63     }
64     return 0;
65 }

hdu1598

这题刚开始用并查集+BFS+优先队列写的 一直WA 感觉是想麻烦了 最后也没做出来 搜到学姐的报告 就仿照着写了写 枚举吧

View Code
 1 #include <iostream>
 2 #include <stdio.h>
 3 #include<string.h>
 4 #include<algorithm>
 5 #define N 1000001
 6 using namespace std;
 7 struct node
 8 {
 9     int u,v,w;
10 }q[1001];
11 int father[201];
12 int find(int x)
13 {
14     if(x!=father[x])
15     father[x] = find(father[x]);
16     return father[x];
17 }
18 void union1(int x,int y)
19 {
20     father[x] = y;
21 }
22 bool cmpp(struct node a,struct node b)
23 {
24     return a.w<b.w;
25 }
26 int main()
27 {
28     int i,j,k,m,n,u,v,w,o;
29     while(scanf("%d%d",&n,&m)!=EOF)
30     {
31         for(i = 0; i < m ; i++)
32         scanf("%d%d%d",&q[i].u,&q[i].v,&q[i].w);
33         sort(q,q+m,cmpp);
34         scanf("%d", &o);
35         while(o--)
36         {
37             scanf("%d%d",&u,&v);
38             k = N;
39             for(i = 0 ; i < m ; i++)
40             {
41                 for(j = 1; j <= n ; j++)
42                 father[j] = j;
43                 for(j = i; j < m ; j++)
44                 {
45                     if(find(q[j].u)!=find(q[j].v))
46                     union1(find(q[j].u),find(q[j].v));
47                     if(find(u)==find(v))
48                     {
49                         w = q[j].w-q[i].w;
50 
51                         if(w<k)
52                         k = w;
53                         break;
54                     }
55                 }
56                 if(j==m)
57                 break;
58             }
59             if(k!=N)
60             printf("%d\n",k);
61             else
62             printf("-1\n");
63         }
64     }
65     return 0;
66 }
原文地址:https://www.cnblogs.com/shangyu/p/2622215.html