UVA 572 油田連通塊 並查集解決

2022-04-05 15:36:02 字數 1816 閱讀 8436

題意:8個方向如果能夠連成一塊就算是乙個連通塊,求一共有幾個連通塊。

分析:網上的題解一般都是dfs,但是今天發現並查集也可以解決,為了方便我自己理解大神的模板,便嘗試解這道題目,沒想到過了。。。

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 

8 #include 9 #include 10 #include

11 #include 12 #include 13 #include 14

#define ll long long

15#define mem(m, a) memset(m, a, sizeof(m))

16#define repu(i, a, b) for(int i = a; i < b; i++)

17#define maxn 1100

18const

double pi=-acos(-1.0

);19

using

namespace

std;

20struct

node

2127 node(int v=0, int x=0, int y=0

):val(v), x(x), y(y) {}

28 } nd[maxn*maxn];

29struct

query

3036 query(int h=0, int id=0

):h(h), id(id) {}

37 } q[100010

];38

bool

vis[maxn][maxn];

39int n, m, pre[maxn*maxn];

40const

int dx= ;

41const

int dy= ;

42int find(int

x)43

47bool ok(int x, int

y)48

51int judge(int x, int

y)5262}

63 sort(v, v+cnt);

64 cnt = unique(v, v+cnt)-v;

65for(int i=0; i < cnt; i++)

66 pre[v[i]] = m*(x-1)+y;///

把篩選下來的全都歸入(x,y)中

67return

1 - cnt;///

返回的值也只有-1,0,168}

69int

main()

7089}90

///都是從大到小

91 sort(nd, nd+tot);

92 memset(vis, 0, sizeof

vis);

93 memset(pre, -1, sizeof

pre);

94int cnt=0,j = 0;95

for(; nd[j].val > 1 && j < tot; j++)

96101 printf("

%d\n

",cnt);

102}

103return0;

104}

105/*

1063 5

107*@*@*

108**@**

109*@*@*

110*/

view code

借助的是uva 1665

大神的模板

uva572 油田 連通塊遍歷

的簡潔性需要注意小技巧 1.方向陣列。2.外麵包一層空氣防止判斷邊界。3.更改原來的陣列的狀態而不需要重新建立vis陣列 這樣會破壞原始資料,是乙個不好的習慣,但是這樣很靈活。include include define directsize 8 struct direct direct direc...

例題 油田(UVa 572)

輸入乙個m行n列的字元矩陣,統計字元 組成多少個八連塊。如果兩個字元 所在的格仔相鄰 橫豎或者對角線方向 就說他們屬於同乙個八連塊。sample input 1 1 3 5 sample output01 分析 dfs基礎題,典型題。用dfs找聯通塊 從每個 格仔出發,遞迴遍歷它周圍的 格仔。每次訪...

uva572 油田 DFS或者並查集 1

給你一塊地圖 其中 代表探測到有油的地方,而 則是代表沒有油的地方。現在題目給出了油田的定義,所有連在一起的 代表乙個油田,而連在一起的定義是有公共點或公共邊。而題目的要求是輸出給你一張地圖上的油田的個數。思路 這個題沒什麼特別的思路,就是找到乙個初始的 然後遍歷一遍,把與他屬於同乙個油田的都標記了...