2 solutions
-
4
题意:
求出有向图中,所有奶牛在的牧场(点)都能到达的牧场(点)的数量
思路:
一个数组
to
来计数奶牛去过的牧场次数sum=0
最后统计次数等于奶牛数量的的牧场
sum+=1
模拟:
输入: 2 4 4 2 3 1 2 1 4 2 3 3 4 图: 1-->2 ↓ ↓ 4<--3 to: 0-->0 ↓ ↓ 0<--0 在牧场2的奶牛搜索完后的to: 0-->1 ↓ ↓ 1<--1 在牧场3的奶牛搜索完后的to: 0-->1 ↓ ↓ 2<--2 奶牛有两只,to有两个为奶牛数量的 输出: 2
代码:
#include<iostream> #include<vector> using namespace std; const int N=1e5; vector<int >g[N];//有向图 bool vis[N]={0};//标记每只奶牛是否走过 int to[N]={0};//计数每只奶牛去过的牧场次数 vector<int >cow;//奶牛 int k,n,m,sum=0; void dfs(int x)//dfs深度深搜 { to[x]+=1;//代表这只牛能走这里 vis[x]=1;//标记 for(int i=0;i<g[x].size();i++)//下条路 { if(!vis[g[x][i]])//是否走过 { vis[g[x][i]]=1;//标记 dfs(g[x][i]);//dfs深度搜索 } } } int main() { cin>>k>>n>>m;//输入 for(int i=0;i<k;i++) { int x; cin>>x;//输入 cow.push_back(x);//添加奶牛所在的牧场 } for(int i=0;i<m;i++) { int u,v; cin>>u>>v;//输入 g[u].push_back(v);//有向图的做法 } for(int i=0;i<k;i++) { fill(vis,vis+N,0);//重置标记 if(!vis[cow[i]])//是否标记过 { dfs(cow[i]);//dfs深度搜索 } } for(int i=0;i<N;i++) { if(to[i]>=k)//当等于奶牛数量时 { sum++;//添加 } } cout<<sum;//输出 return 0;//完结散花 }
-
1
翻译:讨论详情 - ZXOJ
题意
当前有 头牛在牧场(编号为 1 到 ),每个牧场有单行道相通(共 条),求有多少个野餐地
野餐地定义:所以牛都能到的牧场
思路
遍历每头牛能去的牧场,看看有哪些牧场所有牛都能去
代码
#include <bits/stdc++.h> using namespace std; vector<int> a[1005]; int c[105],f[1005],cnt; // c 存当前牛在的牧场,f 记有几头牛能到这个牧场 bool v[1005]; void dfs(int n){ v[n] = 1; f[n]++; // 这头牛能到这个牧场 for (int i = 0;i < a[n].size();i++){ if(!v[a[n][i]]) dfs(a[n][i]); } } int main(int argc, char **argv){ int k,n,m; cin >> k >> n >> m; for (int i = 0;i < k;i++){ cin >> c[i]; } for (int i = 0;i < m;i++){ int A,B; cin >> A >> B; a[A].push_back(B); // A 通向 B 的单行道 } for (int i = 0;i < k;i++){ dfs(c[i]); // 这头牛能到哪些牧场 memset(v,0,sizeof(v)); // 重置 } for(int i = 1;i <= n;i++){ if (f[i] == k) cnt++; // 如果所有牛都能到,就把能野餐的地方加 1 } cout << cnt; return 0; }
- 1
Information
- ID
- 976
- Time
- 1000ms
- Memory
- 125MiB
- Difficulty
- 6
- Tags
- # Submissions
- 28
- Accepted
- 11
- Uploaded By