题目:
给出一个无向图,输出图中连通分支的个数。无向图的连通分支是一个子图,因此在子图两个节点之间至少存在一个路径。
Example:
输入:给出一个连通图的二维数组
01000
10100
01000
00000
00000
输出:联通子图的个数
解析:
从二位数组的第一行开始遍历,只遍历上三角(因为无向图是对称的),遍历第i行如果map中没有i把i加入到map中,然后对第i行的每个值进行遍历,当grape[i][j]
的值为1的时候,把j放入堆栈中,遍历完第行之后,对堆栈中的数据(j)出栈,把其放入map中,然后对第j行进行遍历,按照这个方式直到堆栈为空,count++,计算出了一个联通子图。
代码1:
#include <iostream>
#include <vector>
#include <map>
#include <stack>
using namespace std;
int getStack(vector<vector<int> > &grape, int i, int n, stack<int> &s)
{
for (int j = i; j < n; ++j)
{
if (grape[i][j] == 1)
s.push(j);
}
return s.size();
}
int getChildGrape(vector<vector<int> > grape)
{
int n = grape.size();
if (n == 0)
return 0;
map<int, int> m;
stack<int> s;
int count = 0;
for (int i = 0; i < n; ++i)
{
if (m.count(i) == 1)
continue;
else
m[i] = 1;
int result = getStack(grape, i, n, s);
if (result == 0)
++count;
else
{
while (s.size() != 0)
{
int temp = s.top(); s.pop();
m[temp] = 1;
getStack(grape, temp, n, s);
}
++count;
}
}
return count;
}
int main()
{
vector<vector<int> > vec = { {0,1,0,0,0},{1,0,1,0,0},{0,1,0,0,0},{0,0,0,0,0},{0,0,0,0,0} };
cout << getChildGrape(vec) << endl;
}
如果结点比较大时,那么占的内存就比较大,在2019年今日头条校园招聘编程第一题用此方法总是提示内存超限,所以用下面这种方法改进。
代码2:
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
using namespace std;
int find(int x, vector<int> &pre)
{
int r = x;
while (pre[r] != r)
r = pre[r];
int i = x, j;
while (i != r)
{
j = pre[i];
pre[i] = r;
i = j;
}
return r;
}
void join(int x, int y, vector<int> &pre)
{
int fx = find(x, pre);
int fy = find(y, pre);
if (fx != fy)
pre[fy] = fx;
}
int main()
{
int point_num;//保存节点的个数
int path_num;//保存路径的个数
scanf("%d %d", &point_num, &path_num);
vector<int> pre(point_num);//用于保存每个结点的父节点
for (int i = 0; i < point_num; ++i)
pre[i] = i;//初始将每个结点的父节点设为自己
for (int i = 0; i < path_num; ++i)
{
int x;
int y;
scanf("%d %d", &x, &y);
join(x, y, pre);
}
int ans = 0;
for (int i = 0; i < point_num; ++i)
{
if (pre[i] == i)
++ans;
}
cout << ans << endl;
return 0;
}
上面代码输入格式为:
4 2
0 2
4 2
第一行告诉你,一共有4个点,2条路。
下面两行告诉你,0、2之间有条路,3、4之间有条路
此方法为用并查集求解。
参考资料:
https://blog.csdn.net/lin_fs/article/details/52845872