分而治之,各個擊破是兵家常用的策略之一。在戰爭中,我們希望首先攻下敵方的部分城市,使其剩餘的城市變成孤立無援,然後再分頭各個擊破。爲此參謀部提供了若干打擊方案。本題就請你編寫程序,判斷每個方案的可行性。
輸入格式:
輸入在第一行給出兩個正整數 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; } }