[算法]PAT-A_1013_无向图创建+连通块个数DFS

本文介绍了一种使用深度优先搜索(DFS)算法遍历图并计算除去特定顶点后的连通块数量的方法。通过邻接表表示图结构,对每个顶点进行DFS遍历,跳过目标删除的顶点,最终统计并输出连通块数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//用一个向量数组代表邻接表,每个元素是一个顶点,向量里存储的是其邻接的顶点
//写一个DFS(int v) 代表去遍历顶点v所在的连通块,其中,若遍历到的结点正好是本轮删除的结点,直接返回
//然后对该顶点的bool置为已查询,再对其每一个邻接顶点,若它的bool是未查询,则递归DFS
//在主函数中先输入n m k等信息,输入邻接关系,然后对于每一个查询k去循环
//循环之外 有一个代表连通块数的变量,并在每次进入循环之前都要把bool数组全置为false

#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;

const int maxn = 1111;
vector<int> G[maxn];
int currentPoint;
bool vis[maxn] = {false};

void DFS(int v){
    if(v==currentPoint) return;
    vis[v] = true;
    for(int i=0;i<G[v].size();i++){
        if(vis[G[v][i]] == false)
            DFS(G[v][i]);
    }
}

int main(){
    int n, m, k;
    scanf("%d%d%d", &n, &m, &k);
    for(int i=0;i<m;i++){
        int p1, p2;
        scanf("%d%d", &p1, &p2);
        G[p1].push_back(p2);
        G[p2].push_back(p1);
    }
    for(int i=0;i<k;i++){
        int blockNum = 0;
        memset(vis, false, sizeof(vis));
        scanf("%d", &currentPoint);
        for(int j=1;j<=n;j++){
            if(j!=currentPoint && vis[j]==false){
                DFS(j);
                blockNum++;
            }
        }
        printf("%d\n", blockNum-1);
    }
    return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值