您的位置:首页 > 理论基础 > 计算机网络

zoj 3811 Untrusted Patrol 2014牡丹江网络赛 dfs

2014-09-08 20:15 302 查看
题目链接:zoj 3811

给定一张n个节点与m条边构成的无向图,其中有k个节点上有传感器,会记录下第一次被访问的时间

现在按被访问时间顺序给出所有被访问过的l个传感器,问在该访问顺序下,是否有可能访问完整张图

图上的深搜。

首先,如果被访问的传感器数量少于k则肯定有节点没被访问过。

对于给定顺序传感器,首先判断该节点是否在可能访问的范围内,

*若不在,则输出No

*若在,则对该点进行深搜,访问图上还没有被访问过点,找出该点访问过之后,哪些点有可能被访问

还有个坑点,整张图有可能不是联通的,只要上述步骤结束后所有点都被访问过了,则说明图是联通的

/******************************************************
* File Name:   c.cpp
* Author:      kojimai
* Creater Time:2014年09月07日 星期日 13时22分40秒
******************************************************/

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<vector>
using namespace std;
#define FFF 100005
int order[FFF],first[FFF],e;
bool flag[FFF];
bool vis[FFF];
struct node
{
int v,next;
}edge[FFF*4];
void addedge(int u,int v)
{
edge[e].v=v;edge[e].next=first[u];first[u]=e++;
}
void dfs(int now)
{
vis[now]=true;
for(int k=first[now];~k;k=edge[k].next)
{
int v=edge[k].v;
if(!vis[v])
{
vis[v]=true;
if(flag[v])
{
flag[v]=false;
}
else
{
dfs(v);
}
}
}
return;
}
int main()
{
int keng,n,m,k,x,y,l;
scanf("%d",&keng);
while(keng--)
{
memset(vis,false,sizeof(vis));
memset(flag,false,sizeof(flag));
e=0;
memset(first,-1,sizeof(first));
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<k;i++)
{
scanf("%d",&x);
flag[x]=true;
}
for(int i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
addedge(x,y);
addedge(y,x);
}
scanf("%d",&l);
for(int i=0;i<l;i++)
scanf("%d",&order[i]);
if(l<k)
{
printf("No\n");
}
else
{
flag[order[0]]=false;
bool ok=true;
for(int i=0;i<l&&ok;i++)
{
if(flag[order[i]]==true)
{
ok=false;
}
else
{
dfs(order[i]);
}
//out();
}
for(int i=1;i<=n&&ok;i++)
{
if(!vis[i])
ok=false;
}
if(ok)
printf("Yes\n");
else
printf("No\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: