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; }
浙公网安备 33010602011771号