Leetcode---547. 省份數量---Tarjin複習
阿新 • • 發佈:2021-01-09
技術標籤:Leetcode每日一練leetcodetarjin
547. 省份數量
有 n
個城市,其中一些彼此相連,另一些沒有相連。如果城市 a
與城市 b
直接相連,且城市 b
與城市 c
直接相連,那麼城市 a
與城市 c
間接相連。
省份 是一組直接或間接相連的城市,組內不含其他沒有相連的城市。
給你一個 n x n
的矩陣 isConnected
,其中 isConnected[i][j] = 1
表示第 i
個城市和第 j
個城市直接相連,而 isConnected[i][j] = 0
表示二者不直接相連。
返回矩陣中 省份 的數量。
示例 1:
輸入:isConnected = [[1,1,0],[1,1,0],[0,0,1]] 輸出:2
示例 2:
輸入:isConnected = [[1,0,0],[0,1,0],[0,0,1]] 輸出:3
提示:
1 <= n <= 200
n == isConnected.length
n == isConnected[i].length
isConnected[i][j]
為1
或0
isConnected[i][i] == 1
isConnected[i][j] == isConnected[j][i]
程式碼
class Solution {
public:
stack<int> stk;
int dfn[201] = {0};
int low[201 ] = {0};
bool vis[201] = {false};
int cnt = 0, ans = 0;
void Tarjin(int x, vector<vector<int>>& isConnected){
dfn[x] = low[x] = ++cnt;
stk.push(x);
vis[x] = true;
for(int i = 0; i < isConnected[x].size(); i++){
if(i == x || !isConnected[ x][i]) continue;
if(!dfn[i]){
Tarjin(i, isConnected);
low[x] = min(low[x], low[i]);
}else if(vis[i]){
low[x] = min(low[x], dfn[i]);
}
}
if(dfn[x] == low[x]){
while(stk.size()){
int top = stk.top();
vis[top] = false;
stk.pop();
if(top == x) break;
}
ans++;
}
}
int findCircleNum(vector<vector<int>>& isConnected) {
int n = isConnected.size();
for(int i = 0; i < n; i++){
if(!dfn[i]) Tarjin(i, isConnected);
}
return ans;
}
};