题解 P2853 【[USACO06DEC]牛的野餐Cow Picnic】
闲得慌就来水了发题解,因为教练叫着出题所以童鞋们就找了一道这样的好题。。。
题目意思是存在牛的地方寻找其他地方来进行聚餐,反正我的第一印象就是bfs,毕竟要寻找你用dfs咋想咋也不靠谱,而bfs可以扩展更多的点。
然后就是解题思路,选择有牛的牧场进行扩展,然后开一个计数数组计数,每遍历到一个点就有该点计数器加一,最后统计如果这个点有k次,那么所有的奶牛就都来过这里,ans++即可。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
int k,n,m,val;
const int N = 10001;
struct edge
{
int next,to;
}e[N<<1];
int head[N<<1],tot,c[N],vis[N],s[N];
void add(int x,int y){
e[++tot].next=head[x];
head[x]=tot;
e[tot].to=y;
}
void bfs(int x){
queue<int>q;
q.push(x);
vis[x]=1;
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(!vis[v]){
vis[v]=1;
s[v]++;//每遍历到该点计数器加一
q.push(v);
}
}
}
}
int main(){
scanf("%d%d%d",&k,&n,&m);
for(int i=1;i<=k;i++) {scanf("%d",&c[i]);s[c[i]]++;}//一开始先计数
for(int i=1;i<=m;i++){
int a,b;
scanf("%d%d",&a,&b);
add(a,b);
}
for(int i=1;i<=k;i++){
memset(vis,0,sizeof(vis));//清空
bfs(c[i]);
}
int ans=0;
for(int i=1;i<=n;i++)
if(s[i]==k)ans++;//统计答案
printf("%d",ans);
}
管理大大求过