俊介三

一天更新一点,一天积累一点

导航

1013. Battle Over Cities (25)

Posted on 2013-03-04 23:08  俊介三在前进  阅读(595)  评论(0)    收藏  举报

1013. Battle Over Cities (25)

http://pat.zju.edu.cn/contests/pat-a-practise/1003

题目转换成这个意思:给一个图,求删掉一个节点后,剩下的图中,有多少个集合。

思路:本来想 求多少个集合,用并查集方便些,后来发现,涉及删掉某个节点,重新构造一下并查集貌似挺麻烦。

于是用了DFS、顺便练习了一下BFS。(后面有时间补个并查集的)

#include <stdio.h>
#include <string.h>
#define MAX 2000

int N,M,K;
int mat[MAX][MAX];
int visit[MAX];

void dfs(int from){
    int i;
    for(i=1;i<=N;i++){
        if(i!=from&&visit[i]==0&&mat[from][i]==1){
            visit[i]=1;
            dfs(i);
        }
    }
}

int main(){
    int i,j;
    int s,e;
    scanf("%d %d %d",&N,&M,&K);

    memset(mat,0,sizeof(mat));
    for(i=0;i<M;i++){
        scanf("%d %d",&s,&e);
        mat[s][e]=mat[e][s]=1;
    }
    
    int city;
    for(i=0;i<K;i++){
        scanf("%d",&city);
        memset(visit,0,sizeof(visit));
        visit[city]=1;
        int count=0;
        for(j=1;j<=N;j++){
            if(visit[j]==0){
                count++;
                dfs(j);
            }
        }
        printf("%d\n",count-1);
    }
    return 0;
}

再贴一个:

//BFS,队列实现
#include <stdio.h>
#include <string.h>
#include <queue>
#define MAX 1005

using namespace std;

int N,M,K;
int mat[MAX][MAX];
bool visit[MAX];

int main(){
    int i,j,k;
    scanf("%d %d %d",&N,&M,&K);
    memset(mat,0,sizeof(mat));
    
    int s,e;
    for(i=0;i<M;i++){
        scanf("%d %d",&s,&e);
        mat[s][e]=mat[e][s]=1;
    }
    
    int city;
    for(i=0;i<K;i++){
        scanf("%d",&city);
        memset(visit,false,sizeof(visit));
        visit[city]=true;
        int count=0;
        for(j=1;j<=N;j++){
            if(!visit[j]){//
                count++;
                queue<int> myq;
                myq.push(j);
                while(!myq.empty()){
                    int temp = myq.front();//
                    myq.pop();
                    for(k=1;k<=N;k++){
                        if(!visit[k]&&mat[temp][k]==1){//
                            visit[k]=true;
                            myq.push(k);
                        }
                    }
                }
            }
        }
        printf("%d\n",count-1);
    }
    return 0;
}