JZOJ 1956. 矩形(pro.pas/cpp)/洛谷 P2449 [SDOI2005]矩形【并查集】

...

  • 题目:
  • 题意:
  • 分析:
  • 代码:


题目:

传送门


题意:

n n n个矩形,若任意两个矩形有重叠的部分的话那就可以将这两个矩形看为一个块
现在问一共有一个块


分析:

把每个矩形看成一个点,然后判断如果重叠就用并查集合并
最后统计下就好了


代码:

#include
#include
#include
#include
#include
#include
#include
#include
#define LL long long 
using namespace std;
inline LL read() {
    LL d=0,f=1;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
    return d*f;
}
int f[7005],n,ans;
struct node{
    int x1,y1,x2,y2;
}v[7005];
int find(int x) {return x==f[x]?x:f[x]=find(f[x]);};
void judge(int x,int y) {f[find(x)]=find(y);return;};
bool check(node x,node y)
{
    if((x.x2<y.x1||y.x2<x.x1)||(x.y2<y.y1||y.y2<x.y1)) return false;
    if((x.x1==y.x2||x.x2==y.x1)&&(x.y1==y.y2||x.y2==y.y1)) return false;
    return true;
}
int main()
{
	freopen("pro.in","r",stdin);
	freopen("pro.out","w",stdout);
	n=read();
	for(int i=1;i<=n;i++) f[i]=i;
	for(int i=1;i<=n;i++)
    {
        v[i].x1=read();v[i].y1=read();v[i].x2=read();v[i].y2=read();
        for(int j=1;j<i;j++) if(check(v[i],v[j])&&find(i)!=find(j)) judge(i,j);
    }
    for(int i=1;i<=n;i++) ans+=f[i]==i;
    cout<<ans;
    return 0;
}

你可能感兴趣的:(并查集)