原题链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5343
题目类型:搜索
ac代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int N = 100000 + 10;
int vis[N];
vector<int> edge[N];
int s[N];
int viss[N];
int t,n,m,k,x,y,qt;
bool bfs(int);
int main()
{
scanf("%d",&t);
while(t--)
{
for(int i = 0; i < N; i++)
edge[i].clear();
memset(viss,0,sizeof(viss));
scanf("%d%d%d",&n,&m,&k);
for(int i = 0;i < k ;i ++)
{
scanf("%d",&s[i]);
}
for(int i = 0; i < m ;i ++)
{
scanf("%d%d",&x,&y);
edge[x].push_back(y);
edge[y].push_back(x);
}
scanf("%d",&qt);
for(int i = 0; i < qt; i ++)
{
scanf("%d",&s[i]);
viss[s[i]] = 1;
}
if(qt < k)
{
printf("No\n");
continue;
}
if(bfs(s[0]))
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
bool bfs(int v0)
{
memset(vis,0,sizeof(vis));
queue<int > q;
q.push(v0);
vis[v0] = 1;
viss[v0] = 0;
int j = 1;
int key = s[j++];
while(!q.empty())
{
int v = q.front();
q.pop();
for(vector<int>::iterator it = edge[v].begin();it != edge[v].end(); it ++)
{
int p = *it;
if(p == key)
{
vis[p] = 1;
viss[p] = 0;
q.push(p);
key = s[j++];
if(j >= qt)
return true;
}
else
{
if(!vis[p])
{
vis[p] = 1;
if(!viss[p])
q.push(p);
}
}
}
}
for(int i = 0; i < qt; i ++)
{
if(!vis[s[i]])
return false;
}
return true;
}
这是参考别人的,比上面的简单:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int N = 100000 + 10;
int vis[N];
vector<int> edge[N];
int s[N];
int viss[N];
int t,n,m,k,x,y,qt;
bool bfs();
int main()
{
scanf("%d",&t);
while(t--)
{
for(int i = 0; i < N; i++)
edge[i].clear();
memset(viss,0,sizeof(viss));
scanf("%d%d%d",&n,&m,&k);
for(int i = 0;i < k ;i ++)
{
scanf("%d",&s[i]);
}
for(int i = 0; i < m ;i ++)
{
scanf("%d%d",&x,&y);
edge[x].push_back(y);
edge[y].push_back(x);
}
scanf("%d",&qt);
for(int i = 0; i < qt; i ++)
{
scanf("%d",&s[i]);
viss[s[i]] = 1;
}
if(qt < k)
{
printf("No\n");
continue;
}
if(bfs())
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
bool bfs()
{
memset(vis,0,sizeof(vis));
vis[s[0]] = 1;
for(int i = 0; i < qt; i ++)
{
if(!vis[s[i]])
return false;
viss[s[i]] = 0;
queue<int> q;
q.push(s[i]);
while(!q.empty())
{
int p = q.front();
q.pop();
for(vector<int>::iterator it = edge[p].begin(); it != edge[p].end();it ++)
{
int v = *it;
if(!vis[v])
{
vis[v] = 1;
if(!viss[v])
q.push(v);
}
}
}
}
for(int i = 1; i <= n; i ++)
{
if(!vis[i])
{
return false;
}
}
return true;
}