# Leetcode 547. Number of Provinces
## DFS
```python=
class Solution:
def findCircleNum(self, isConnected: List[List[int]]) -> int:
length = len(isConnected)
visited = [False for i in range(length)] # 是否被訪問
output = 0
for node in range(length):
if visited[node]: # 已訪問過就不訪問
continue
else:
# DFS
stack = [node]
while stack:
current = stack.pop()
neighbors = isConnected[current]
for i in range(len(neighbors)): # 訪問所有相鄰節點
if current == i or visited[i]: # 自己或是已經訪問過的節點就跳過
continue
elif neighbors[i] == 1: # 相鄰節點入棧,標記已訪問
stack.append(i)
visited[i] = True
visited[node] = True # 標記自己已訪問
output += 1 # 省份加一
return output
```
## Union Find
```python!
class UnionFindSet:
def __init__(self, size: int):
self.parent = [i for i in range(size + 1)]
self.ranks = [0 for i in range(size + 1)]
def find(self, x: int) -> int:
if x != self.parent[x]:
self.parent[x] = self.find(self.parent[x])
return self.parent[x]
def union(self, u: int, v: int) -> bool:
pu = self.find(u)
pv = self.find(v)
if pu == pv:
return False
if self.ranks[pu] > self.ranks[pv]:
self.parent[pv] = pu
elif self.ranks[pu] > self.ranks[pv]:
self.parent[pv] = pu
else:
self.parent[pu] = pv
self.ranks[pu] += 1
return True
class Solution:
def findCircleNum(self, isConnected: List[List[int]]) -> int:
size = len(isConnected)
uf = UnionFindSet(size)
for i in range(size):
for j in range(i+1, size):
if isConnected[i][j] == 1:
uf.union(i,j)
res = set()
for i in range(size):
res.add(uf.find(i))
return len(res)
```