PAT 甲级 1013 Battle Over Cities

PAT 甲级 1013 Battle Over Cities

无向图、连通分量、dfs

首先构造一个无向图,然后去掉一个节点和与其连接的边,输出剩余节点生成连通图需要添加的边数。

可知要把n个连通分量生成连通图所需的边数为n-1,我们只需要求出去掉某个节点之后剩余的联通分量数

例子中去掉1则2 3都是连通分量,所需边数为2-1=1;

去掉2或3剩余的连通分量数都是1,所需边数为1-1=0;

每次从一个未访问过的节点出发,可以遍历一个连通分量,将该分量上的每个节点都置为访问过

// 1013 Battle Over Cities.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <algorithm>
using namespace std;
int v[1005][1005];
bool visit[1005];
int n;

void dfs(int node) {
    visit[node] = true;
    for (int i = 1; i <= n; i++) {
        if (visit[i] == false && v[node][i] == 1) {
            dfs(i);
        }
    }
}
int main()
{
    int m, k, a, b;
    scanf("%d%d%d", &n, &m, &k);
    for (int i = 0; i < m; i++) {
        scanf("%d%d", &a, &b);
        v[a][b] = v[b][a] = 1;
    }
    for (int i = 0; i < k; i++) {
        fill(visit, visit + 1005, false); //每次循环都要把visit重置
        scanf("%d", &a);
        visit[a] = true;
        int cnt = 0;
        for (int j = 1; j <= n; j++) {
            if (visit[j] == false) { //未访问过的节点,从他开始遍历整个连通分量
                cnt++; //找到一个新连通分量
                dfs(j);
            }
        }
        cout << cnt - 1 << endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值