L2-025 分而治之 (25分)

分而治之,各個擊破是兵家常用的策略之一。在戰爭中,我們希望首先攻下敵方的部分城市,使其剩餘的城市變成孤立無援,然後再分頭各個擊破。爲此參謀部提供了若干打擊方案。本題就請你編寫程序,判斷每個方案的可行性。

輸入格式:

輸入在第一行給出兩個正整數 N 和 M(均不超過10 000),分別爲敵方城市個數(於是默認城市從 1 到 N 編號)和連接兩城市的通路條數。隨後 M 行,每行給出一條通路所連接的兩個城市的編號,其間以一個空格分隔。在城市信息之後給出參謀部的系列方案,即一個正整數 K (≤ 100)和隨後的 K 行方案,每行按以下格式給出:

Np v[1] v[2] ... v[Np]

其中 Np 是該方案中計劃攻下的城市數量,後面的系列 v[i] 是計劃攻下的城市編號。

輸出格式:

對每一套方案,如果可行就輸出YES,否則輸出NO

輸入樣例:

10 11
8 7
6 8
4 5
8 4
8 1
1 2
1 4
9 8
9 1
1 10
2 4
5
4 10 3 8 4
6 6 1 7 5 4 9
3 1 8 4
2 2 8
7 9 8 7 6 5 4 2

輸出樣例:

NO
YES
YES
NO
NO

 解題思路:

題目意思是攻下後,任意兩個城市都不相連;

遍歷所有道路,只有還有城市相連,計劃失敗;

實現代碼:

#include<iostream>
#include<map>
using namespace std;
int main(void) {
	int n, m,k,np,c,flag;
	cin >> n >> m;
	pair<int, int> *city = new pair<int, int>[m];
	for (int i = 0; i < m;i++)//相連城市 
		cin>>city[i].first>>city[i].second;
	cin >> k;
	for (int i = 0; i < k; i++) {
		cin >> np;
		map<int, int> mp;
		for (int j = 0; j < np; j++) {//佔領城市
			cin >> c;
			mp[c] = 1;
		}
		flag = 1;
		for (int j = 0; j < m; j++) 
			if (mp[city[j].first] == 0 && mp[city[j].second] == 0) {//任意兩個城市都不相連
				cout << "NO" << endl;
				flag = 0;
				break;
			}
		if (flag)
			cout << "YES" << endl;
	}
}

 

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