题意:
战争爆发了,要保证所有城市的连接。但是,一旦某个城市被占领了,那这个城市和其他城市的连接就断开了。现在要求在某些城市被占领的情况下,需要修多少路保证其他城市的连接。比如3个城市123,有1-2和1-3两条路,如果1被占领了,这两条路就都断了,为了保证2和3连接,需要建一条路。
解:
求一个图在断开某些连接情况下的连通分量个数。再减去2就是答案了,为什么-2呢?首先孤立出来被占领的城市构成一个联通分量,所以减掉它。然后剩下的n个联通分量,需要n-1条路来连接。综上,联通分量-2就是需要的路的数量。
代码:
//1013 DFS
int visit[1005];
int g[1005][1005];
int kk[1005];
int backup[1005];
int n,m,k,cnt_con;
void discon(int i){
memset(backup,0,sizeof(backup));
for(int j=1;j<=n;j++){
if(g[i][j]) backup[j] = 1;
g[i][j] = g[j][i] = 0;
}
}
void backcon(int i){
for(int j=1;j<=n;j++)
if(backup[j]) g[i][j] = g[j][i] = 1;
}
void DFS(int i){
visit[i] = 1;
for(int j=1;j<=n;j++){
if(g[i][j]&&!visit[j])
DFS(j);
}
return;
}
int main(){
int x,y;
while(scanf("%d %d %d",&n,&m,&k)!=EOF){
while(m--){
scanf("%d %d",&x,&y);
g[x][y] = 1;
g[y][x] = 1;
}
for(int p=0;p<k;p++){
scanf("%d",kk+p);
}
for(int i=0;i<k;i++){
cnt_con = 0;
int now = kk[i];
memset(visit,0,sizeof(visit));
discon(now);
for(int t=1;t<=n;t++){
if(!visit[t]) {DFS(t);cnt_con++;}
}
backcon(now);
printf("%d\n",cnt_con-2);
}
}
return 0;
}