两种方法:
1、图的遍历:每遇到一个未被访问的顶点,连通分量统计加1,并把其子图中所有顶点置为已访问。
这里我没有把广度优先遍历单独写一个函数,是为了回避传二维数组的麻烦。
2、并查集:若两个顶点间有边,则union这两个顶点并压缩路径,最后统计独立集合的个数。
#include <cstdio>
#include <queue>
using namespace std;
const int maxv = 1001;
int N, M, K;
int graph[maxv][maxv] = {
};
//删除city号顶点,判断图中剩下几个连通分量,返回要补上的边的个数
int check(int city);
int main(){
scanf("%d%d%d", &N, &M, &K);
while(M--){
int v1, v2;
scanf("%d%d"