省份数量
有 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]
思路:该题是一个典型的有关图的问题,就是确定连通图的数量,首先设置一个和节点数长度的数组,通过遍历代价矩阵,若i->j可达则在临时数组中使值等于j位置的值的所有元素等于数组i位置的值,代表集合j是属于i集合的。遍历结束以后,临时数组中不同的值的个数即是结果。
#include<iostream>
using namespace std;
int a[4][4]={1,0,0,1,0,1,1,0,0,1,1,1,1,0,1,1};
int findcirclenum(int n);
int main()
{
cout <<findcirclenum(4);
return 0;
}
int findcirclenum(int n)
{
int*t=new int [n];
int num=0;
for(int i=0;i<n;i++)
t[i]=i;
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
if(a[i][j]==1 && t[i]!=t[j])
{
int nk = t[j];
for (int mk = 0; mk < n;mk++)
{
if(t[mk]==nk)
t[mk] = t[i];
}
}
for(int i=0;i<n;i++)
if(t[i]==i)
num++;
return num;
}