PAT 甲級 1013 Battle Over Cities【DFS】

題意:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章