1013. Battle Over Cities 解析

这个题目其实是DFS遍历图,然后看要几遍才能遍历完整个图。然后那个城市被占领就是那个点已经访问过。还要几次才能遍历完。


#include <iostream>
#include <vector>

using namespace std;



void DFS(vector<int> * Ad,bool * isVisit, int u) {
	isVisit[u] = true;
	for (int i = 0; i < Ad[u].size(); i++) {
		int v = Ad[u][i];
		if (!isVisit[v])
			DFS(Ad,isVisit,v);
	}
}

int DFSTrave(vector<int> * Ad, bool * isVisit, int N) {
	int times = 0;
	for (int u = 0; u < N; u++) {
		if (!isVisit[u]) {
			DFS(Ad,isVisit,u);
			times++;
		}
	}
	return times - 1;
}


int main(){

	int N, M, K;
	cin >> N >> M >> K; //N顶点数 M边数 K监测点数

	vector<int> * Ad = new vector<int> [N];
	bool * isVisit = new bool[N];
	
	
	int tempHead =0 , tempTail = 0;
	for (int i = 0; i < M; i++) {
		cin >> tempHead >> tempTail;	
		tempHead = tempHead - 1; //归0 题目点从1开始
		tempTail = tempTail - 1;//归0
		Ad[tempHead].push_back(tempTail);
		Ad[tempTail].push_back(tempHead);
	}

	//for (int i = 0; i < N; i++) {
	//	cout << i << ": ";
	//		for (int j = 0; j < Ad[i].size(); j++)
	//			cout << Ad[i][j] << " ";
	//	cout << endl;
	//}

	vector <int> F;
	int tempF;
	for (int i = 0; i < K; i++) {
		cin >> tempF;
		tempF = tempF - 1;//归0
		F.push_back(tempF);
	}


	for (int i = 0; i < F.size(); i++){
		int Num = 0;
		for (int i = 0; i < N; i++)
			isVisit[i] = false;
		isVisit[F[i]] = true;
		Num = DFSTrave(Ad, isVisit, N);
		cout << Num << endl;
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值