http://www.patest.cn/contests/pat-a-practise/1013
easy
偷个懒,用了邻接矩阵和dfs,还以为会超时,结果一次过了
求每次去掉x的连通分量个数n,使图连通,则添加n-1条边
注意点:
每次都掉与x相关的边,但是这就破坏了g图,因此要复制,等待此次结果完成,再还原g图
//复制g图
void cop(){...}
//还原g图
void re(){...}
#include <cstdio>
#include <string.h>
#define MAX 1010
int g[MAX][MAX];
int vis[MAX];
int n,m,k;
void init(int x){
for(int i=1;i<=x;i++){
for(int j=1;j<=x;j++){
g[i][j]=0;
}
vis[i]=0;
}
}
int gg[MAX][MAX];
void cop(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
gg[i][j]=g[i][j];
}
}
}
void re(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
g[i][j]=gg[i][j];
}
}
}
void dfs(int x){
vis[x]=1;
for(int i=1;i<=n;i++){
if(g[x][i]!=0 && vis[i]==0){
dfs(i);
}
}
}
int main(){
freopen("in.txt","r",stdin);
scanf("%d %d %d",&n,&m,&k);
init(n);
for(int i=0;i<m;i++){
int a,b;
scanf("%d %d",&a,&b);
g[a][b]=1;
g[b][a]=1;
}
for(int i=0;i<k;i++){
int x;
scanf("%d",&x);
memset(vis,0,sizeof(vis));
int cha[MAX];
//复制,因为此时改变了g后面遍历会出错,因此现在把g记下来
cop();
for(int i=1;i<=n;i++){
g[i][x]=0;
g[x][i]=0;
}
vis[x]=1;
//dfs返回连通分量个数
int ans=0;
for(int j=1;j<=n;j++){
if(vis[j]==0){
dfs(j);
ans++;
}
}
printf("%d\n",ans-1);
//还原
re();
}
return 0;
}