題意:
戰爭爆發了,要保證所有城市的連接。但是,一旦某個城市被佔領了,那這個城市和其他城市的連接就斷開了。現在要求在某些城市被佔領的情況下,需要修多少路保證其他城市的連接。比如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;
}