c++90分(超痛苦)求助

P2853 [USACO06DEC] Cow Picnic S

@[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


|