zoj 2811

原題鏈接: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;
}


發佈了19 篇原創文章 · 獲贊 7 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章