【图论】【并查集】矩形(ssl 1222)
生活随笔
收集整理的這篇文章主要介紹了
【图论】【并查集】矩形(ssl 1222)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
矩形
ssl 1222
題目大意:
有n個矩陣,現在將有重疊部分的兩個矩陣合并成一個圖形,問有多少個圖形
原題:
題目描述
在一個平面上有n個矩形。每個矩形的邊都平行于坐標軸并且都具有值為整數的頂點。我們用如下的方式來定義塊。
? 每一個矩形都是一個塊。
? 如果兩個不同的矩形有公共線段,那么它們就組成了一個新的塊來覆蓋它們原來的兩個塊。
例子:
在圖1中的矩形組成了兩個不同的塊。
寫一個程序:
從文件PRO.IN中讀入矩形的個數以及它們的頂點。
找出這些矩形形成的不同的塊的個數。
將結果寫入文件PRO.OUT。
輸入
在輸入文件PRO.IN的第一行又一個整數n,1 <= n <=7000,表示矩形的個數。接下來的n行描述矩形的頂點,每個矩形用四個數來描述:左下頂點坐標(x,y)與右上頂點坐標(x,y)。每個矩形的坐標都是不超過10000的非負整數。
輸出
在文件PRO.OUT的第一行應當僅有一個整數—表示由給定矩形組成的不同的塊的個數。
輸入樣例
9 0 3 2 6 4 5 5 7 4 2 6 4 2 0 3 2 5 3 6 4 3 2 5 3 1 4 4 7 0 0 1 4 0 0 4 1輸出樣例
2樣例解釋
如下圖,第1,2,4,7,8,9個矩陣合并成一個圖形,第3,5,6個矩陣合并成一個圖形
解題思路:
判斷兩個矩陣是否重合,如果重合,那么用并查集連接在一起,最后判斷,自己是根節點的點有多少個即可
代碼:
#include<cstdio> #define max(a,b) (a)>(b)?(a):(b) #define min(a,b) (a)<(b)?(a):(b) using namespace std; int n,xx,yy,ans,dad[7005]; struct rec {int x1,y1,x2,y2; }a[7005]; bool pd(int x,int y)//判斷是否重合 {if ((a[x].x1==a[y].x2||a[y].x1==a[x].x2)&&(a[x].y1==a[y].y2||a[y].y1==a[x].y2)) return false;if (a[x].x1<=a[y].x2&&a[y].x1<=a[x].x2&&a[x].y1<=a[y].y2&&a[y].y1<=a[x].y2) return true;return false; } int find(int dep){return dad[dep]==dep?dep:dad[dep]=find(dad[dep]);}//并查集 void hb(int x,int y)//合并 {xx=find(x);yy=find(y);dad[min(xx,yy)]=max(xx,yy); } int main() {scanf("%d",&n);for (int i=1;i<=n;++i){dad[i]=i;scanf("%d %d %d %d",&a[i].x1,&a[i].y1,&a[i].x2,&a[i].y2);for (int j=1;j<i;++j)if (pd(i,j)) hb(i,j);}for (int i=1;i<=n;++i)if (find(i)==i)//判斷ans++;printf("%d",ans); }總結
以上是生活随笔為你收集整理的【图论】【并查集】矩形(ssl 1222)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 混凝土三维图像中裂缝的分割方法混凝土三维
- 下一篇: 【并查集】家谱(luogu 2814/s