【ACM】- PAT. A1013 Battle Over Cities 【图的遍历】

题目链接
题目分析

1、无向图
2、节点编号1-N
3、删去一个结点,查看变成几个连通块

解题思路

每次删除删遍历,看剩余接个连通块(DFS的次数)


AC程序(C++)
/**********************************
*@Author: 3stone
*@ACM: PAT.A1013 Battle Over Cities
*@Time: 18/8/12
*@IDE: VSCode 2018 + clang++
***********************************/
#include<cstdio>

using namespace std;

const int maxn = 1010;

int N, M, K; //结点数,边数,查询数

int G[maxn][maxn]; //邻接矩阵
bool vis[maxn] = {false}; //标记结点是够访问

void DFS(int u) {
    vis[u] = true;
    for(int i = 1; i <= N; i++)
        if(vis[i] == false && G[u][i] != 0)
            DFS(i);
}


int main() {

    int node_a, node_b;

    while(scanf("%d%d%d", &N, &M, &K) != EOF) {

        //初始化 所有结点无连接
        for(int i = 0; i < maxn; i++) 
            for(int j = 0; j < maxn; j++)
                G[i][j] = 0;  //本题为无权图  

        //输入图信息
        for(int i = 1; i <= M; i++) { //输入边的信息
            scanf("%d%d", &node_a, &node_b);
            G[node_a][node_b] = 1;  //无向图
            G[node_b][node_a] = 1;
        }

        int lost; //保存丢失的结点编号
        int num; //记录连通块数(DFS次数)
        //逐个检查(删去)
        for(int i = 1; i <= K; i++){ 

            for(int i = 0; i < maxn; i++ ){
                vis[i] = false;
            }
            num = 0;

            scanf("%d", &lost);
            vis[lost] = true; //标记为已访问,相当于丢失
            for(int j = 1; j <= N; j++){

                if(vis[j] == false){
                    DFS(j);
                    num++;
                }

            }
            printf("%d\n", num - 1); //输出需要添加的边数
        }

    }//while

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_26398495/article/details/81610835