题目详情 - L2-025 分而治之 (25 分) (pintia.cn)
题解:思路很简单,就是构建一个图,然后根据输入把图破坏掉,之后判断图中剩下的点是不是单独的。然鹅,TLE了。之后就是对它的优化,我之前的想法是对于每个输入的点,我每次遍历一下全图把该点去掉。后面就是用一个集合把要去掉的点记为非法的点。之后对每个合法的点判断是不是和它相邻的点都是非法的,如果有合法的代表它不是孤立的。
Code Segment:
#include<cstdio>
#include<set>
using namespace std;
const int maxn=1e4+1;
int main()
{
int n,m,i,j,k,np,v,a,b,t;
set<int> s[maxn],vs;
scanf("%d%d",&n,&m);
while(m--)
{
scanf("%d%d",&a,&b);
s[a].insert(b);
s[b].insert(a);
}
scanf("%d",&k);
while(k--)
{
scanf("%d",&np);
while(np--)
{
scanf("%d",&v);
vs.insert(v);
}
t=0;
for(i=1;i<=n;i++)
if(!vs.count(i))
{
for(auto it=s[i].begin();it!=s[i].end();it++)
{
if(!vs.count(*it))
{
t=1;
break;
}
}
if(t)
break;
}
vs.clear();
if(i>n)
printf("YES\n");
else
printf("NO\n");
}
}