题目
题目不难,但是应该是看到的这个思路,感觉挺不错的,记录一下
这个思路,有一种入栈出栈的感觉(个人感觉)
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
vector<int> v[N];
int main()
{
int n, m, a, b;
scanf("%d%d", &n, &m);
for(int i=0; i<n; i++){
scanf("%d%d", &a, &b);
v[a].push_back(b);
v[b].push_back(a);
}
while(m--){
int k;
scanf("%d", &k);
set<int> st;
bool flag=true;
for(int i=0; i<k; i++){
scanf("%d", &a);
if(st.find(a)!=st.end()){
flag=false;
} else {
for(int j=0; j<(int)v[a].size(); j++){
st.insert(v[a][j]);
}
}
}
if(flag){
printf("Yes\n");
} else {
printf("No\n");
}
}
return 0;
}
这种思路就比较地简单粗暴和沙雕,但也能过。
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
set<int> st[N];
vector<int> v;
bool flag[N];
int main()
{
int n, m;
scanf("%d%d", &n, &m);
int a, b;
for(int i=0; i<n; i++){
scanf("%d%d", &a, &b);
st[a].insert(b);
st[b].insert(a);
flag[a]=true;
flag[b]=true;
}
while(m--){
int k;
scanf("%d", &k);
v.clear();
for(int i=0; i<k; i++){
scanf("%d", &a);
if(flag[a]){
v.push_back(a);
}
}
bool judge=true;
int len=(int)v.size();
for(int i=0; i<len; i++){
for(int j=i+1; j<len; j++){
if(st[v[i]].find(v[j])!=st[v[i]].end()){
judge=false;
break;
}
}
}
if(judge){
printf("Yes\n");
} else {
printf("No\n");
}
}
return 0;
}