n个点,m条双向边,k个传感器。其中有l个传感器记录到了第一次到达的时间顺序,求是否有可能检查了所有的顶点。
首先判断l,l<k一定是不行的。然后按照传感器的时间顺序dfs,先从第一个传感器位置搜索dfs搜到所有的到达传感器的位置结束,如果这个传感器被标记为可访问,则从这个传感器继续搜索下一层传感器,否则是不能满足时间顺序的。最后还要判断整个图的连通性,所有的顶点都要可以到达的。
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <cmath> #include <iomanip> #include <cstdlib> #include <algorithm> using namespace std; const int maxn=110000; int head[maxn]; int visit[maxn]; int pile[maxn]; int n,m,k,l; int num; int s; struct Edge { int u,v; int next; }edge[maxn*4]; void addedge(int u,int v) { edge[num].u=u; edge[num].v=v; edge[num].next=head[u]; head[u]=num++; edge[num].u=v; edge[num].v=u; edge[num].next=head[v]; head[v]=num++; } void dfs(int u) { visit[u]=1; for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].v; if(visit[v]) { continue; } if(pile[v]) { visit[v]=1; continue; } dfs(v); } } void dfs1(int u) { visit[u]=1; s++; for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].v; if(!visit[v]) { dfs1(v); } } } int main() { int t; int flag; int u,v; scanf("%d",&t); while(t--) { flag=1; s=0; num=0; memset(head,-1,sizeof(head)); memset(visit,0,sizeof(visit)); memset(pile,0,sizeof(pile)); scanf("%d%d%d",&n,&m,&k); for(int i=0;i<k;i++) { scanf("%d",&u); pile[u]=1; } for(int i=0;i<m;i++) { scanf("%d%d",&u,&v); addedge(u,v); } scanf("%d",&l); if(l<k) { flag=0; } scanf("%d",&u); dfs(u); for(int i=1;i<l;i++) { scanf("%d",&u); if(!visit[u]) { flag=0; } if(flag) { dfs(u); } } memset(visit,0,sizeof(visit)); dfs1(1); if(s<n) { flag=0; } if(flag) { printf("Yes\n"); } else { printf("No\n"); } } return 0; }
ZOJ-3811 Untrusted Patrol DFS 2014牡丹江网络赛C题
原文地址:http://blog.csdn.net/q295657451/article/details/39121813