题意
给你一个n个点的无向图,图有m条无向边,k次询问,每次询问,删去一个点,问你需要加几条边使得图的强连通分量为1
思路
用邻接矩阵存储图,
m
a
p
[
i
]
[
j
]
=
1
map[i][j]=1
map[i][j]=1代表i点到j点有条路,若为0则没有路
用dfs来遍历图来判断图有几个强连通分量,用vis来记录哪些点被访问过了
void dfs(int x)
{
vis[x]=1;
for(int i=1;i<=n;i++)
{
if(!vis[i]&&a[x][i]==1)
{
vis[i]=1;
dfs(i);
}
}
return ;
}
遍历开始时先对要删除的点的vis[x]=1,使得后续的点不能访问这个点,那么就达到了删点的作用了
#include<bits/stdc++.h>
using namespace std;
int a[1005][1005];
int vis[1005];
int n;
void dfs(int x)
{
vis[x]=1;
for(int i=1;i<=n;i++)
{
if(!vis[i]&&a[x][i]==1)
{
vis[i]=1;
dfs(i);
}
}
return ;
}
int main()
{
int m,k;
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
a[u][v]=1;
a[v][u]=1;
}
while(k--)
{
for(int i=1;i<=n;i++)
vis[i]=0;
int x;
scanf("%d",&x);
int ans=-1;
vis[x]=1;
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
ans++;
dfs(i);
}
}
printf("%d\n",ans);
}
return 0;
}