@[lrj3247](/user/983702) 看不懂您代码的思路呢,可以参考一下我的代码
```cpp
#include<bits/stdc++.h>
using namespace std;
const int N = 10005;
int k, n, m, vis[N], a[N], ans;
bool cmp[N];
vector<int> p[N];
void dfs(int x) {
cmp[x] = true;
++vis[x];
for (int i = 0; i < p[x].size(); ++i)
if (!cmp[p[x][i]])
dfs(p[x][i]);
}
int main() {
scanf("%d%d%d", &k, &n, &m);
for (int i = 1; i <= k; ++i)
scanf("%d", &a[i]);
for (int i = 1; i <= m; ++i) {
int x, y;
scanf("%d%d", &x, &y);
p[x].push_back(y);
}
for (int i = 1; i <= m; ++i) {
memset(cmp, 0, sizeof(cmp));
dfs(a[i]);
}
for (int i = 1; i <= n; ++i)
if (vis[i] == k)
++ans;
printf("%d", ans);
return 0;
}
```
没吸氧,63ms
by mediocre_ @ 2023-07-27 19:35:59
@[lrj3247](/user/983702) 您这个代码似乎有很多处地方是多余的呢,能更我讲讲您的思路吗?
by mediocre_ @ 2023-07-27 19:37:20
@[mediocre_](/user/565707) 总算有dalao回我了,我刚入门2个月,这是注释版。
```
#include <bits/stdc++.h>
using namespace std;
int k,n,m,cow[101],f[1001],s[10001],e[10001],ans,fa[1001];
bool vis[1001];
vector <int> q[10001];
int dfs(int num,int now)//让奶牛去牧场,这样就可以省时间。now代表着现在在哪一个牧场,num进行搜索的牧场的奶牛的数量(原谅我语言表达能力不好)
{
f[now]+=num;//之所以加num是因为通过一个牧场的奶牛一起搜索。
int len=q[now].size(),x=len;//len是现在连接这个牧场的路的数量。
for(int i = 1 ; i<=len ; i++)
{
--x;//遍历
if(vis[q[now][x]]==true)//如果这条路没有被搜索过。
{
vis[q[now][x]]=false;//标记。
dfs(num,q[now][x]);//搜索。
}
}
}
int main()
{
cin>>k>>n>>m;
for(int i = 1 ; i<=k ; i++)
{
cin>>cow[i];//输入
fa[cow[i]]++;//奶牛所在的牧场的奶牛数量++。
}
for(int i = 1 ; i<=m ; i++)
{
cin>>s[i]>>e[i];//输入。
q[s[i]].push_back(e[i]);
}
for(int i = 1 ; i<=n ; i++)
{
if(fa[i]>0)如果这个牧场有奶牛,就dfs。
{
memset(vis,true,sizeof(vis));//先清理标记。
dfs(fa[i],i);//搜索。
}
}
for(int i = 1 ; i<=n ; i++)
{
if(f[i]>=k)//如果能被所有奶牛走到。
ans++;//答案++。
}
cout<<ans;//输出。
return 0;
}
```
感谢dalao帮助。
by lrj3247 @ 2023-08-01 10:53:28