zoukankan      html  css  js  c++  java
  • 并查集的几道题(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 }
  • 相关阅读:
    使用Egret Conversion 转化as代码到ts代码,
    C++ 部分知识点
    mac下 使用 versions版本控制工具 修复游戏bug过程
    Egret 显示容器
    Egret --视觉编程,显示对象,事件
    VS2015 使用
    TypeScript 学习四 面向对象的特性,泛型,接口,模块,类型定义文件*.d.ts
    Prestashop--网站后台配置(一)
    Prestashop--访问优化
    eclipse 中 Android sdk 无法更新的问题
  • 原文地址:https://www.cnblogs.com/shangyu/p/2622215.html
Copyright © 2011-2022 走看看