hdu 1198(并查集 )

自从懂了并查集只后,感觉好多题都是并查集,就像哪一天的字典树一样,这道题一看就是一个并查集,最后查询父节点有几个,

难点:建模的时候应该吧上下联通的和左右联通的标记一下,只要他们和上下左右的都能连通,就把他们并到一个集合里面,我是只判断下和右即可,

源代码:

#include<stdio.h>
#include<string.h>
int up[8], down[8], right[8], left[8];
int par[2504];
char map[54][54];
char mp1[100][100];
char mp2[100][100];
void init()
{
    up[0] = 'A'; up[1] = 'B'; up[2] = 'E'; up[3] = 'G'; up[4] = 'H'; up[5] = 'J'; up[6] = 'K';
    down[0] = 'C'; down[1] = 'D'; down[2] = 'E'; down[3] = 'H'; down[4] = 'I'; down[5] = 'J'; down[6] = 'K';
    left[0] = 'A'; left[1] = 'C'; left[2] = 'F'; left[3] = 'G'; left[4] = 'H'; left[5] = 'I'; left[6] = 'K';
    right[0] = 'B'; right[1] = 'D'; right[2] = 'F'; right[3] = 'G'; right[4] = 'I'; right[5] = 'J'; right[6] = 'K';
    memset(mp1, 0, sizeof(mp1));
    memset(mp2, 0, sizeof(mp2));
    for (int i = 0; i <= 6; i++){
        for (int j = 0; j <= 6; j++){
            mp1[down[i]][up[j]] = 1;
            mp2[right[i]][left[j]] = 1;
        }
    }
}

int findset(int x){
   if(x!=par[x])
   par[x]=findset(par[x]);
   return par[x];
}

void unite(int x,int y){
   int px=findset(x);
   int py=findset(y);
   if(px!=py)
   par[py]=px;
}
int main()
{
    int M, N;
    init();
    while (scanf("%d%d", &M, &N) != EOF){
        if (M == -1 && N == -1) break;
        for (int i = 0; i < M; i++){
            scanf("%s", map[i]);
        }

        for (int i = 0; i <= M * N; i++){
            par[i] = i;
        }
        for (int i = 0; i < M; i++){
            for (int j = 0; j < N; j++){
                if (j < N - 1 && mp2[map[i][j]][map[i][j+1]] == 1){
                    int t1 = i * N + j;
                    int t2 = i * N + j + 1;
                    unite(t1, t2);
                }

                if (i < M - 1 && mp1[map[i][j]][map[i + 1][j]] == 1){
                    int t1 = i * N + j;
                    int t2 = (i + 1) * N + j;
                    unite(t1, t2);
                }
            }
        }

        int ans = 0;
        for (int i = 0; i < M * N; i++){
            if (par[i] == i){
                ans++;
            }
        }

        printf("%d\n", ans);
    }
    return 0;
}

时间: 2024-12-20 02:56:52

hdu 1198(并查集 )的相关文章

HDU 1051 并查集+贪心

Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 11694    Accepted Submission(s): 4837 Problem Description There is a pile of n wooden sticks. The length and weight of each stick ar

HDU 1512 并查集+左偏树

Monkey King Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3105    Accepted Submission(s): 1330 Problem Description Once in a forest, there lived N aggressive monkeys. At the beginning, they e

hdu 1829 并查集(食物链的弱化版)

http://acm.hdu.edu.cn/showproblem.php?pid=1829 Problem Description Background  Professor Hopper is researching the sexual behavior of a rare species of bugs. He assumes that they feature two different genders and that they only interact with bugs of

hdu 4514 并查集+树形dp

湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 4539    Accepted Submission(s): 816 Problem Description 随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,

hdu 1856 并查集

http://acm.hdu.edu.cn/showproblem.php?pid=1856 More is better Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 327680/102400 K (Java/Others)Total Submission(s): 13672    Accepted Submission(s): 5008 Problem Description Mr Wang wants some boys

HDU 1181 并查集 or SPFA

变形课 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 12773    Accepted Submission(s): 4733 Problem Description 呃......变形课上Harry碰到了一点小麻烦,因为他并不像Hermione那样能够记住所有的咒语而随意的将一个棒球变成刺猬什么的,但是他发现了变形咒语的一个统一规

hdu 1213 并查集入门

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1213 How Many Tables Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 12538    Accepted Submission(s): 6145 Problem Description Today is Ignatius' b

HDU 3938 并查集

求小于L的路径点对数(路上的最大值),按权值排序,从小到大并查集建图,有点kruskal的意思. /** @Date : 2017-09-22 17:30:11 * @FileName: HDU 3938 并查集 离线.cpp * @Platform: Windows * @Author : Lweleth ([email protected]) * @Link : https://github.com/ * @Version : $Id$ */ #include <bits/stdc++.h>

HDU 1829 并查集

A Bug's Life Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8224    Accepted Submission(s): 2631 Problem Description Background Professor Hopper is researching the sexual behavior of a rare sp