【算法分析與設計】【第四周】547. Friend Circles

題目來源: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 ̄)づ

發佈了29 篇原創文章 · 獲贊 10 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章