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;
}
原文地址:https://www.cnblogs.com/fxh0707/p/14475649.html