1134 Vertex Cover (25 分)
判断点覆盖,用前向星直接切。
idx存储边的下标,idx^1为反向边,注意边数组开两倍,因为存的双边。
const int N=1e4+10;
int h[N],e[N<<1],ne[N<<1],idx;
bool vis[N<<1];
int n,m,q;
void add(int a,int b)
{
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int main()
{
memset(h,-1,sizeof h);
cin>>n>>m;
while(m--)
{
int a,b;
cin>>a>>b;
add(a,b);
add(b,a);
}
cin>>q;
while(q--)
{
memset(vis,0,sizeof vis);
int k;
cin>>k;
for(int i=0;i<k;i++)
{
int x;
cin>>x;
for(int j=h[x];~j;j=ne[j])
vis[j]=vis[j^1]=true;
}
bool ok=true;
for(int i=0;i<idx;i++)
if(!vis[i])
{
ok=false;
break;
}
if(ok) puts("Yes");
else puts("No");
}
//system("pause");
return 0;
}
或者直接暴力就好了,省去用前向星存图了。
const int N=1e4+10;
PII e[N];
bool vis[N];
int n,m,q;
int main()
{
cin>>n>>m;
for(int i=0;i<m;i++) cin>>e[i].fi>>e[i].se;
cin>>q;
while(q--)
{
memset(vis,0,sizeof vis);
int k;
cin>>k;
for(int i=0;i<k;i++)
{
int x;
cin>>x;
vis[x]=true;
}
bool ok=true;
for(int i=0;i<m;i++)
if(!vis[e[i].fi] && !vis[e[i].se])
{
ok=false;
break;
}
if(ok) puts("Yes");
else puts("No");
}
//system("pause");
return 0;
}