题目分析
分而治之,各个击破是兵家常用的策略之一。在战争中,我们希望首先攻下敌方的部分城市,使其剩余的城市变成孤立无援,然后再分头各个击破。为此参谋部提供了若干打击方案。本题就请你编写程序,判断每个方案的可行性。 原题链接
简言之,就是给定顶点及部分边,构成图。 随后再给出几组的顶点,问删掉这些顶点,图中是否就没有边存在
边存在首先想到用度d[] 表示,只要有一个顶点的度大于0,此方案就不通过 N 和 M(均不超过10 000)的数据范围巨大,无法直接用数组来存储图,会有两个测试点无法通过。因此选择用vector ,存储有效边,这样就节约了遍历不存在边的时间
C++
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 10;
vector<int> g[N];
int d[N], backup[N];
int n, m;
int main() {
cin >> n >> m;
for (int i = 0; i < m; i++) {
int a, b;
cin >> a >> b;
g[a].push_back(b);
g[b].push_back(a);
d[a]++, d[b]++;
}
int k;
cin >> k;
while (k--) {
memcpy(backup, d, sizeof d);
int np;
cin >> np;
for (int i = 0; i < np; i++) {
int x;
cin >> x;
for (int j = 0; j < g[x].size(); j++) {
d[x]--;
d[g[x][j]]--;
}
}
bool flag = true;
for (int i = 1; i <= n; i++) {
if (d[i] > 0) {
flag = false;
break;
}
}
if (flag) puts("YES");
else puts("NO");
memcpy(d, backup, sizeof d);
}
return 0;
}
|