lightoj 1111 - Best Picnic Ever(dfs or bfs)
Posted Gealo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lightoj 1111 - Best Picnic Ever(dfs or bfs)相关的知识,希望对你有一定的参考价值。
题目链接 http://www.lightoj.com/volume_showproblem.php?problem=1111
题意:给你一个有向图再给你几个人的位置,问所有人可以在哪些点相聚。
简单的搜索题,可以用bfs也可以用dfs,要注意的是存边的时候最好用vector,因为边比较少。
用struct会超时。下面附上dfs和bfs代码。
#include <iostream> #include <cstring> #include <queue> #include <vector> #include <cstdio> using namespace std; int a[1100] , map[1100] , vis[1100]; vector<int> s[1100]; void bfs(int st) { queue<int>q; q.push(st); vis[st] = 1; map[st]++; while(!q.empty()) { int gg = q.front(); int len = s[gg].size(); for(int i = 0 ; i < len ; i++) { if(vis[s[gg][i]] != 1) { map[s[gg][i]]++; vis[s[gg][i]] = 1; q.push(s[gg][i]); } } q.pop(); } } int main() { int t; scanf("%d" , &t); int ans = 0; while(t--) { ans++; int k , n , m; for(int i = 0 ; i <= 1100 ; i++) { s[i].clear(); } memset(map , 0 , sizeof(map)); scanf("%d%d%d" , &k , &n , &m); for(int i = 0 ; i < k ; i++) scanf("%d" , &a[i]); for(int i = 0 ; i < m ; i++) { int x , y; scanf("%d%d" , &x , &y); s[x].push_back(y); } for(int i = 0 ; i < k ; i++) { memset(vis , 0 , sizeof(vis)); bfs(a[i]); } int cnt = 0; for(int i = 1 ; i <= n ; i++) { //cout << map[i] << endl; if(map[i] == k) cnt++; } printf("Case %d: %d\n" , ans , cnt); } return 0; }
#include <iostream> #include <cstring> #include <queue> #include <vector> #include <cstdio> using namespace std; int a[1100] , map[1100] , vis[1100]; vector<int> s[1100]; void dfs(int st) { vis[st] = 1; int len = s[st].size(); for(int i = 0 ; i < len ; i++) { if(vis[s[st][i]] == 0) { map[s[st][i]]++; dfs(s[st][i]); } } return; } int main() { int t; scanf("%d" , &t); int ans = 0; while(t--) { ans++; int k , n , m; for(int i = 0 ; i <= 1100 ; i++) { s[i].clear(); } memset(map , 0 , sizeof(map)); scanf("%d%d%d" , &k , &n , &m); for(int i = 0 ; i < k ; i++) scanf("%d" , &a[i]); for(int i = 0 ; i < m ; i++) { int x , y; scanf("%d%d" , &x , &y); s[x].push_back(y); } for(int i = 0 ; i < k ; i++) { memset(vis , 0 , sizeof(vis)); map[a[i]]++; dfs(a[i]); } int cnt = 0; for(int i = 1 ; i <= n ; i++) { //cout << map[i] << endl; if(map[i] == k) cnt++; } printf("Case %d: %d\n" , ans , cnt); } return 0; }
以上是关于lightoj 1111 - Best Picnic Ever(dfs or bfs)的主要内容,如果未能解决你的问题,请参考以下文章
(状压) Marriage Ceremonies (lightOJ 1011)
LightOJ - 1020 Childhood Game (博弈)
LightOJ - 1148 Mad Counting(坑)