图的基本概念-连通分支数

图的基本概念-连通分支数在这里插入图片描述在这里插入图片描述

在这里插入代码片
// 图的邻接表存储结构,C++ 简化版

#include <iostream>
#include <vector>
using namespace std;
const int maxn = 1000000;
vector<vector<int>> g;
int ans=0;
//vector <int>g[maxn];
int nv;
int ne;
bool vis[maxn];
bool Hash[maxn];
void DFS(int nv){//u为当前访问的顶点标号,depth为深度
	vis[nv]=true;//设置u已被访问
	if(g[nv].size()==0)
        ans++;
	for(int i=0;i<g[nv].size();++i){//对从u出发可以到达的所有顶点v
		int v=g[nv][i];
		if(!vis[v])
            DFS(v);//如果v未被访问,访问v,深度+1
	}
}
int DFSTrave(){//遍历该图

	for(int u=0; u<=nv; ++u){//对每个顶点u
		if(Hash[u] && !vis[u]){//如果u未被访问
			DFS(u);//访问u和u所在的连通块
			++ans;//连通块数+1
		}
	}
	return ans;
	//printf("%d\n",ans);
}
int main(void)
{
    // 输入顶点个数 nv 和边的个数 ne
    cin >> nv >> ne;
    g.resize(nv); // 根据顶点个数分配空间
    // 输入边
    for (int e = 0; e < ne; e++) {
        int u, v;
        cin >> u >> v; // 读取一条边 (u,v)
        g[u].push_back(v); // u --> v
        g[v].push_back(u); // 无向图增加 v --> u
        Hash[v]=Hash[u]=true;
    }
    DFSTrave();
    for(int i=0;i<nv;i++)//如果有孤立的点存在的话也算一个连通分量
    {
        if(g[i].size()==0)
            ans++;
    }
	printf("%d\n",ans);
    return 0;
}


更新,又微改了一下

```cpp

```cpp
// 图的邻接表存储结构,C++ 简化版
#include <iostream>
#include <vector>
using namespace std;
const int maxn = 1000000;
vector<vector<int>> g;
int ans=0;
int nv;
int ne;
bool vis[maxn];
bool Hash[maxn];
void DFS(int nv){//u为当前访问的顶点标号,depth为深度
	vis[nv]=true;//设置u已被访问
	for(int i=0;i<g[nv].size();++i){//对从u出发可以到达的所有顶点v
		int v=g[nv][i];
		if(!vis[v])
            DFS(v);//如果v未被访问,访问v,深度+1
	}
}
int DFSTrave(){//遍历该图
	for(int u=0; u<=nv; ++u){//对每个顶点u
		if(Hash[u] && !vis[u]){//如果u未被访问并且u存在。
			DFS(u);//访问u和u所在的连通块
			++ans;//连通块数+1
		}
	}
	return ans;
}

int main(void)
{
    // 输入顶点个数 nv 和边的个数 ne
    cin >> nv >> ne;
    g.resize(nv); // 根据顶点个数分配空间
    // 输入边
    for (int e = 0; e < ne; e++) {
        int u, v;
        cin >> u >> v; // 读取一条边 (u,v)
        g[u].push_back(v); // u --> v
        g[v].push_back(u); // 无向图增加 v --> u
        Hash[u]=Hash[v]=true;//u可能并不是连续的,所以在dfsTrave的时候要辨别一下,有没有这个顶点
    }
    DFSTrave();
    for(int i=0;i<nv;i++)
    {
        if(g[i].size()==0)
            ans++;
    }
	printf("%d\n",ans);
    return 0;
}




  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值