2014 ACM-ICPC亚洲区域赛牡丹江站网络预选赛 CUntrusted Patrol

来源:互联网 发布:钓鱼执法 知乎 编辑:程序博客网 时间:2024/04/29 08:46

这道题想了很久 没想明白。。。。。。

比赛完了看了厦大大神的 代码,才知道原来可以这样子。。。。

C++0x  //330Ms#include <iostream>#include <algorithm>#include <fstream>#include <climits>#include <cstring>#include <cstdio>#include <vector>#include <stack>#include <queue>#include <cmath>#include <set>using namespace std;typedef long long LLong;const int Maxn=1e5+3;const int MaxStateNum=Maxn*8;const double eps=1e-9;const double PI=atan(1.0)*4.0;const int INF=1e9;const int MemsetBigNum=127;const int MemsetSmallNum=9856;      /// intÐÍ ÖµÎª -2139062144 INT_MIN:-214783648struct Edge{    int v,next;}edges[Maxn*4];int N,M,K,L,arr[Maxn];bool vis[Maxn],ssFlag[Maxn];int head[Maxn],edgeNum;int nodeCnt,ssCnt;void initG(){    edgeNum=0;    memset(head,-1,sizeof(head));}void addEdge(int u,int v){    edges[edgeNum].v=v;    edges[edgeNum].next=head[u];    head[u]=edgeNum++;}void dfs(int u){    for(int i=head[u];i!=-1;i=edges[i].next)    {        Edge &e=edges[i];        if(!vis[e.v])        {            nodeCnt++;            vis[e.v]=true;            if(ssFlag[e.v])            {                ssFlag[e.v]=0;                ssCnt++;            }            else dfs(e.v);        }    }}int main(){//    freopen("input.txt","r",stdin);//    freopen("out.txt","w",stdout);//    ios::sync_with_stdio(false);    int T;    scanf("%d",&T);    while(T--)    {        initG();        scanf("%d%d%d",&N,&M,&K);        memset(ssFlag,0,sizeof(ssFlag));        for(int i=0;i<K;i++)        {            int x;            scanf("%d",&x);            ssFlag[x]=1;        }        for(int i=0;i<M;i++)        {            int a,b;            scanf("%d%d",&a,&b);            addEdge(a,b);            addEdge(b,a);        }        scanf("%d",&L);        for(int i=0;i<L;i++)            scanf("%d",&arr[i]);        if(L!=K)        {            printf("No\n");            continue;        }        memset(vis,false,sizeof(vis));        ssFlag[arr[0]]=0;        vis[arr[0]]=true;        ssCnt=nodeCnt=1;        dfs(arr[0]);        for(int i=1;i<L;i++)        {            if(ssFlag[arr[i]])break;            dfs(arr[i]);        }//        cout << ssCnt << " " << nodeCnt << endl;        if(ssCnt==L&&nodeCnt==N)printf("Yes\n");        else printf("No\n");    }    return 0;}


0 0
原创粉丝点击