hdu1198 普通的并查集

时间:2023-03-09 21:48:49
hdu1198 普通的并查集

今天开始(第三轮)并查集,,之前学的忘了一些

本题很简单直接上代码

#include<iostream>
#include<cstring>
#include<cstdio>
#define MAXN 55
using namespace std;
int F[MAXN*MAXN];
int find(int x){
if(F[x]==-) return x;
return F[x]=find(F[x]);
}
void bing(int a,int b){
int t1=find(a);
int t2=find(b);
if(t1!=t2) F[t1]=t2;
}
char mp[MAXN][MAXN];
int main(){
int n,m;
while(scanf("%d%d",&n,&m)== && n>){
for(int i=;i<n;i++)
for(int j=;j<m;j++)
cin>>mp[i][j];
for(int i=;i<n*m;i++)
F[i]=-;
for(int i=;i<n;i++)
for(int j=;j<m;j++){//上下联通或者左右联通
if(i> && (mp[i][j]=='A'||mp[i][j]=='B'||mp[i][j]=='E'||mp[i][j]=='G'||mp[i][j]=='H'||mp[i][j]=='J'||mp[i][j]=='K'))
if(mp[i-][j]=='C'||mp[i-][j]=='D'||mp[i-][j]=='E'||mp[i-][j]=='H'||mp[i-][j]=='I'||mp[i-][j]=='J'||mp[i-][j]=='K')
bing(i*m+j,(i-)*m+j);
if(j> && (mp[i][j]=='A'||mp[i][j]=='C'||mp[i][j]=='F'||mp[i][j]=='G'||mp[i][j]=='H'||mp[i][j]=='I'||mp[i][j]=='K'))
if(mp[i][j-]=='B'||mp[i][j-]=='D'||mp[i][j-]=='F'||mp[i][j-]=='G'||mp[i][j-]=='I'||mp[i][j-]=='J'||mp[i][j-]=='K')
bing(i*m+j,i*m+j-);
}
int ans=;
for(int i=;i<n*m;i++)
if(F[i]==-)
ans++;
printf("%d\n",ans);
}
return ;
}