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;
}

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