一、题目详情
输入解释
- 第一行输入三个整数N、M、K,分别为图中的节点数、边数和查询数
- 下面M行依次为各边的两个端点
- 最后一行为K个整数,是要查询的节点。
输出解释
K行,对每个查询来说,删除该节点后为使图连题所需要添加的边数
思路
显而易见~要添加的边数等于连通块数-1,可以用dfs遍历来求出连通块数。
二、实现代码
#include<iostream>
#include<vector>
#include<cstring> //用到memset时要包含
using namespace std;
int n,m,k;
const int maxn=1111;
vector<int> G[maxn];
bool visited[maxn];
int node=0;
void dfs(int i)
{
if(i==node) return; //遇到删除的节点,返回
visited[i]=true;
for(int j=0;j<G[i].size();j++)
{
if(!visited[G[i][j]]) dfs(G[i][j]);
}
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
G[a].push_back(b);
G[b].push_back(a);
}
for(int j=0;j<k;j++)
{
scanf("%d",&node);
int block = 0;
memset(visited,0,sizeof(visited));
for(int i=1;i<=n;i++)
{
if(i!=node && !visited[i])
{
dfs(i);
block++;
}
}
cout<<block-1<<endl;
}
}