(1)如何把a->k塊表示出來,從而使之容易判斷兩塊地是否可以歸併到一起
例如:
把a塊劃分如上圖所示,有4個方向,與其他塊有通路的方向標記為1,反之為0,所以a=,其他同理
(2)如何在map中識別是那一塊,然後根據這一塊找到它的四個方向的0/1情況呢?這裡把a->k等效成了0-11(通過座標找到map所在位置的字元,然後用此字元減去』a』),然後開闢乙個a[11][4]的陣列標記a->k每一塊的方向
(3)約定把map中的塊從左到右,從上到下,標記為第1塊,一直到n*m塊,通過座標(i,j),可以計算這是那一塊(公式i*n+j),從而在下面的並查集的函式(初始化函式,find函式,以及歸併函式)中容易操作
#include
#include
#include
#include
using namespace std;
int f[3100];
char mp[55][55];
intm,n;
char pipe[11][5]=;
int find(int
x)void union(int
x,int
y)int main()
int cnt = 0;
for(int i=0;i
*n;i++)
printf("%d\n",cnt);
}return
0;}
hdu 1198 並查集應用
其實可能是因為知道是用並查集做的原因啦,一下就看出題意了,明顯是並查集思想,每次輸入地圖中的一塊,檢測這一塊與它頂頭的那塊可不可以相通 如果可以合併集合 同理檢測其與它左邊的那一塊 最後遍歷一遍看有多少個根結點即要多少個水源 下面是 有點亂 include include define m 55 d...
HDU3938 並查集 並查集
先按邊權值排個序,每次加入一條邊,用並查集,關鍵看懂題。include include include include using namespace std const int maxn 10010 int n,m,q struct edge edges maxn 5 inline int cmp...
HDU 1232 1213並查集應用 練習
並查集還是挺簡單的,路徑壓縮,按秩合併 這個很麻煩,建議了解就好,主要是路徑壓縮,我寫的 也只是普通的合併 前天學的,要練練手,以防生疏 include include define maxn 10010 define inf 999999999 using namespace std int ma...