題目來源:https://leetcode.com/problems/friend-circles/description/
題目大意:在有N位同學的班級中,存在着同學們自己的“朋友圈”。在此我們規定朋友是對稱的,換句話說,若A是B的朋友,那麼B也是A的朋友(如果不對稱也是有點恐怖,防火防盜防閨蜜,瑟瑟發抖)。再者,朋友間具有傳遞性,即若A是B的朋友,B是C的朋友,那麼A、C互爲朋友。
用N*N矩陣M代表同學間的友誼情況,M[i][j] = 1代表第i個同學和第j個同學間存在朋友關係,求出該班級內“朋友圈”的個數。
其實題目的提示很明顯了。“有N位同學的班級”、“用N*N矩陣M代表同學間的友誼情況”暗示了這是一道與圖有關的題目,以每個同學作爲頂點,若兩兩爲朋友,則這兩個頂點存在邊,而且是無向邊。
那麼問題簡化成了,找出無向圖中連通圖的個數。
那就很簡單了。判斷是否連通有很多種方法,這裏就用剛剛學習的dfs作爲課後複習吧。找出連通圖的個數也很好處理,只要把visited數組遍歷一遍,若visited[i] == 0則代表該點沒走過,可以從該點開始進行一次dfs。最後看看一共進行了幾次dfs就是有幾塊連通圖了。
#define NMAX 2000
int visited[NMAX] = {0};
void DFS(int** M, int MRowSize, int MColSize, int v) {
visited[v] = 1; // begin with v
for (int i = 0; i < MRowSize; i++) {
if (M[v][i] != 0){
if (visited[i] == 0) DFS(M, MRowSize, MColSize, i); //recursion
}
}
}
int findCircleNum(int** M, int MRowSize, int MColSize) {
for (int i = 0; i < NMAX; i++) visited[i] = 0; // (**)
int count = 0;
for (int i = 0; i < MRowSize; i++) {
int flag;
if (visited[i] == 0) {
count++;
DFS(M, MRowSize, MColSize, i);
}
}
return count;
}
這是做到的最直白的一道medium了,很是開心。
當然中間也bug了一下,一開始忘記寫(**)的部分。如果有很多樣例一起測試,那麼不清空visited數組是不行噠。給自己提個醒吧。
國慶快樂呀~(づ ̄ 3 ̄)づ