分析
给出不合适的货物,要求从给出的各块中判断是否存在不合适货物
不合适的货物:建图保存
注:此题的不合适货物没有传递性,因此不需要dfs,直接判断即可
判断:需要2轮遍历,时间复杂度为n^2(n为货物数量)
原因:必须等到货物全部给出才能遍历,不能边给边判断
因此剪枝思路是 缩小n的大小
货物其中 有合适和不合适货物,因此把合适货物(不在图中的剪掉)
具体做法用set的非重复性剪掉
代码
#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
int couple, frequency, quantity;
unordered_map<int, set<int> >graph;
set<int>visit;
void InPut();
bool Judge();
int main() {
InPut();
for (int i = 0; i < frequency; i++)
Judge() ? printf("Yes\n") : printf("No\n");
return 0;
}
void InPut() {
scanf("%d %d", &couple, &frequency);
int x, y;
for (int i = 0; i < couple; i++) {
scanf("%d %d", &x, &y);
graph[x].insert(y);
graph[y].insert(x);
visit.insert(x);
visit.insert(y);
}
}
bool Judge() {
scanf("%d", &quantity);
vector<int> sequence;
int x;
for (int i = 0; i < quantity; i++) {
scanf("%d", &x);
if (visit.find(x) != visit.end())
sequence.push_back(x);
}
for (int i = 0; i < sequence.size(); i++) {
for (int j = i + 1; j < sequence.size(); j++) {
if (graph[sequence[i]].find(sequence[j]) != graph[sequence[i]].end()) {
return false;
}
}
}
return true;
}