题目链接:点击查看
题目描述:
有 n
个城市,其中一些彼此相连,另一些没有相连。如果城市 a
与城市 b
直接相连,且城市 b
与城市 c
直接相连,那么城市 a
与城市 c
间接相连。省份是一组直接或间接相连的城市,组内不含其他没有相连的城市。给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。返回矩阵中省份的数量。
输入输出:
输入:isConnected = [[1,1,0],[1,1,0],[0,0,1]] 输出:2
输入:isConnected = [[1,0,0],[0,1,0],[0,0,1]] 输出:3
题目分析:
在这一道题里面,每一行(列)表示一个节点,它的每列(行)表示是否存在一个相邻节点。而本题拥有 n 个节点,每个节点最多有 n 条边,表示和每个城市相连,最少可以有 1 条边,表示自己与自己相连。此题本质上与此前写的695题是一样的,都是求省份(岛屿)的个数(最大面积)。
代码:
int findCircleNum(vector<vector<int>>& isConnected)
{
int n=isConnected.size(),count=0;
vector<bool>visited(n,false);//现将所有节点标识为均未访问
for(int i=0;i<n;++i)
{
if(!visited[i])
{
dfs(isConnected,i,visited);
++count;
}
}
return count;
}
void dfs(vector<vector<int>>&isConnected,int i,vector<bool>&visited)
{
visited[i]=true;
for(int k=0;k<isConnected.size();++k)
{
if(isConnected[i][k]==1&&!visited[k])//从当前行进行遍历,如果遇到相连城市,则跳到那一个相连的城市,再从头进行遍历
{ //这样便可以找到所有与最开始城市相连的所有城市,都标记为已访问过,这些城市属于同一个省份
//故返回主函数将count(省份)数量加一
dfs(isConnected,k,visited);
}
}
}