PAT-图的遍历-1013 Battle Over Cities

57 阅读1分钟

思路

  • 直接把被占领的城市标记为已访问,遍历得到连通图的数量,减一即为所求。

注意

代码

#include<algorithm>
#include<queue>
using namespace std;

const int maxn=10001;
int N,M,K;
int G[maxn][maxn]={0};
bool vis[maxn]={false};

void BFS(int u){
	queue<int> q;
	q.push(u);
	vis[u]=true;
	while(q.size()){
		int temp=q.front();
		q.pop();
		for(int i=1;i<=N;i++){
			if(G[temp][i]&&vis[i]==false){
				q.push(i);
				vis[i]=true;
			}
		}
	}
}

int BFSTrave(){
	int ans=0;
	for(int i=1;i<=N;i++){
		if(vis[i]==false){
			BFS(i);
			ans++;
		}
	}
	return ans;
}

void initial(){
	for(int i=1;i<=N;i++){
		vis[i]=false;
	}
}

int main(){
	scanf("%d%d%d",&N,&M,&K);
	int a,b,c;
	for(int i=1;i<=M;i++){
		scanf("%d%d",&a,&b);
		G[a][b]=G[b][a]=1;
	}
	for(int i=0;i<K;i++){
		initial();
		scanf("%d",&c);
		vis[c]=true;
		int ans=BFSTrave();
		printf("%d\n",ans-1);
	}
	return 0;
}