并查集应用hdu1198

就是给并查集换了个形式

判断是否能连接那我写的比较麻烦

可以用四个字符表示四个方向

01开关

判断的时候只需要判断两个方向

一开始感觉无从想法

一步步顺着想有些还是会变简答的

#include<cstdio>
#include<algorithm>
using namespace std;
char a[51][51];
int sett[2500 + 50];
int find2(int x)
{
    while(x!=sett[x] ) x=sett[x];
    return x;
}
void merge2(int a,int b)
{
        int fa = find2(a);
        int fb = find2(b);
        if(fa > fb) sett[fa]=fb;
        else sett[fb]=fa;
}
int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)&&n>0&&m>0)
    {
        for(int i=1;i<=n;i++) scanf("%s",a[i]+1);
        for(int i=1;i<=n*m;i++) sett[i]=i;

//         for(int i=1;i<=n;i++){
//        for(int j=1;j<=m;j++){
//            printf("%d ",sett[i][j]);
//        }
//        printf("\n");
//        }
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
        {
            if(j+1<=m&& (a[i][j] == 'B'||a[i][j] == 'D'||a[i][j] == 'F'||a[i][j] == 'G'||a[i][j] == 'I'||a[i][j] == 'J'||a[i][j] == 'K') && (a[i][j+1]=='A'||a[i][j+1]=='C'||a[i][j+1]=='F'||a[i][j+1]=='G'||a[i][j+1]=='H'||a[i][j+1]=='I'||a[i][j+1]=='K'))
                merge2(sett[(i-1)*m+j],sett[(i-1)*m+j+1]);
            if(i+1<=n&& (a[i][j] == 'C'||a[i][j] == 'D'||a[i][j] == 'E'||a[i][j] == 'H'||a[i][j] == 'I'||a[i][j] == 'J'||a[i][j] == 'K') && (a[i+1][j]=='A'||a[i+1][j]=='B'||a[i+1][j]=='E'||a[i+1][j]=='G'||a[i+1][j]=='H'||a[i+1][j]=='J'||a[i+1][j]=='K'))
                 merge2(sett[(i-1)*m+j],sett[(i)*m+j]);
        }
//        for(int i=1;i<=n*m;i++) printf("%d ",i);printf("\n");
        int countt=0;
        for(int i=1;i<=n*m;i++) if(sett[i] == i) countt++;
        printf("%d\n",countt);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-01 20:08:16

并查集应用hdu1198的相关文章

HDU1198水管并查集Farm Irrigation

Benny has a spacious farm land to irrigate. The farm land is a rectangle, and is divided into a lot of samll squares. Water pipes are placed in these squares. Different square has a different type of pipe. There are 11 types of pipes, which is marked

HDU--1198 Farm Irrigation (并查集做法+DFS做法)

Problem Description Benny has a spacious farm land to irrigate. The farm land is a rectangle, and is divided into a lot of samll squares. Water pipes are placed in these squares. Different square has a different type of pipe. There are 11 types of pi

并查集练习1

举头望明月,低头敲代码... 推荐学习地址:http://www.cnblogs.com/cyjb/p/UnionFindSets.html 简单: hdu1213 How Many Tables:新手必秒 1 #include<cstdio> 2 const int N=1001; 3 int f[N]; 4 void init(int n){ 5 for(int i=1;i<=n;++i) 6 f[i]=i; 7 } 8 int fin(int x){ 9 if(x!=f[x])f[

并查集知识学习

(转) 并查集的作用:并和查,即合并和查找,将一些集合合并,快速查找或判断某两个集合的关系,或某元素与集合的关系,或某两个元素的关系. 并查集的结构:并查集主要操作对象是森林,树的结构赋予它独特的能力,对整个集合操作转换为对根节点(或称该集合的代表元素)的操作,一个集合里的元素关系不一定确定,但相对于根节点的关系很明了,这也是为了查找方便. 并查集优化方法:按秩合并和路径压缩的配合使用,使得查找过程优化到极致.按秩合并,每次将深度小的树合并到深度大的树里面去,使得整棵树尽量矮:路径压缩,将当前节

并查集 专题总结

一.题目类型: 1.普通并查集: poj2513 Colored Sticks hdu1198 Farm Irrigation SCAU 1138 代码等式 Gym - 100676F Palindrome Codeforces Round #363 (Div. 2) D. Fix a Tree Codeforces Round #376 (Div. 2) C. Socks 2.种类并查集: HDU3038 How Many Answers Are Wrong POJ1182 食物链 POJ24

详解并查集

详解并查集  Powered by WSY in SSF    2019-11-02  13:46 [1]并查集的定义:   并查集(Disjoint  Set)是一种非常精巧的非常实用的数据结构,它主要用来处理一些不相交集合的合并问题,经典的例子有联通子图,最小生成树的克鲁斯-卡尔算法. [2]并查集的经典问题:   我们通常使用“帮派”.“团伙”等问题举例说明并查集.例如帮派问题: 在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足: 1. 我朋友的朋友是我的朋友: 2. 我敌

CodeForces 745C Hongcow Builds A Nation 并查集

题意: 给了你n个城市 m条边 k个政府 每个政府管辖的区域内不能和其他政府的区域有相连 即政府之间不存在路径 问你在维护这种关系的同时 最多再加多少条边 思路: 先找出来每个联通块 再找出来没有归属的孤立的点 把他们都放到最大的联通块里 然后每个联通块之间的点两两连边是n*(n-1)/2条边 最后算出来的ans-m就好了 (看别人的博客学了一个max_element 1 #include<bits/stdc++.h> 2 #define cl(a,b) memset(a,b,sizeof(a

并查集(个人模版)

并查集: 1 int find(int a) 2 { 3 int r=a; 4 while(f[r]!=r) 5 r=f[r]; 6 int i=a; 7 int j; 8 while(i!=r) 9 { 10 j=f[i]; 11 f[i]=r; 12 i=j; 13 } 14 return r; 15 } 16 int merge(int a,int b) 17 { 18 int A,B; 19 A=find(a); 20 B=find(b); 21 if(A!=B) 22 { 23 f[B

并查集应用

题目描述: One way that the police finds the head of a gang is to check people's phone calls. If there is a phone call between A and B, we say that A and B is related. The weight of a relation is defined to be the total time length of all the phone calls