ZOJ 3811

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5343

网络赛这水题没写过太伤了,赛后写了下1A。

当时钻牛角尖一定要用k次bfs,其实一次就够了,把扩展到的节点插入set中,复杂度nlogn

#include <iostream>

#include <cstdio>

#include <cstring>

#include <set>

#include <vector>

#include <queue>

using namespace std ;



vector <int> mp[100005] ;

set <int> s ;

int idx[100005] ;

int vis[100005] ;

int node[100005] ;

int find(int x)

{

    return idx[x]==x?x:idx[x]=find(idx[x]) ;

}



int n,m,k ;

int flag[100005] ;



int main()

{

    int T ;

    scanf("%d",&T) ;

    while(T--)

    {

        scanf("%d%d%d",&n,&m,&k) ;

        memset(flag,0,sizeof(flag)) ;

        for(int i=0 ;i<100005 ;i++)

            mp[i].clear() ;

        s.clear() ;

        memset(vis,0,sizeof(vis)) ;

        for(int i=1 ;i<=n ;i++)

            idx[i]=i ;

        for(int i=0 ;i<k ;i++)

        {

            int x ;

            scanf("%d",&x) ;

            flag[x]=1 ;

        }

        int ff=1 ;

        while(m--)

        {

            int a,b ;

            scanf("%d%d",&a,&b) ;

            mp[a].push_back(b) ;

            mp[b].push_back(a) ;

            int p=find(a) ;

            int q=find(b) ;

            if(p!=q)

                idx[p]=q ;

        }

        for(int i=2 ;i<=n ;i++)

        {

            if(find(idx[1])!=find(idx[i]))

            {

                ff=0 ;

                break ;

            }

        }

        int L ;

        scanf("%d",&L) ;

        if(L!=k)ff=0 ;

        for(int i=0 ;i<L ;i++)

            scanf("%d",&node[i]) ;

        queue <int> q ;

        s.insert(node[0]) ;

        for(int j=0 ;j<L ;j++)

        {

            if(s.find(node[j])!=s.end())

            {

                q.push(node[j]) ;

                vis[node[j]]=1 ;

                while(!q.empty())

                {

                    int u=q.front() ;

                    q.pop() ;

                    for(int i=0 ;i<mp[u].size() ;i++)

                    {

                        if(!vis[mp[u][i]])

                        {

                            vis[mp[u][i]]=1 ;

                            if(flag[mp[u][i]])

                            {

                                s.insert(mp[u][i]) ;

                            }

                            else

                            {

                                q.push(mp[u][i]) ;

                            }

                        }

                    }

                }

                continue ;

            }

            else

            {

                ff=0 ;

                break ;

            }

        }

        if(ff)puts("Yes") ;

        else puts("No") ;

    }

    return 0 ;

}
View Code

 

 

你可能感兴趣的:(ZOJ)