题目描述
K(1≤K≤100)K(1≤K≤100) 只奶牛分散在 N(1≤N≤1000)N(1≤N≤1000) 个牧场.现在她们要集中起来进餐。牧场之间有 M(1≤M≤10000)M(1≤M≤10000) 条有向路连接,而且不存在起点和终点相同的有向路.她们进餐的地点必须是所有奶牛都可到达的地方。那么,有多少这样的牧场可供进食呢?
输入格式
Line 1: Three space-separated integers, respectively: K, N, and M
Lines 2..K+1: Line i+1 contains a single integer (1..N) which is the number of the pasture in which cow i is grazing.
Lines K+2..M+K+1: Each line contains two space-separated integers, respectively A and B (both 1..N and A != B), representing a one-way path from pasture A to pasture B.
输出格式
Line 1: The single integer that is the number of pastures that are reachable by all cows via the one-way paths.
输入数据 1
2 4 4
2
3
1 2
1 4
2 3
3 4
输出数据 1
2
这道题简直是一道标准到不能再标准的图论题
1.分析题目:
①奶牛各自在各自的牧场中,一些牧场之间有路,且为有向图
②目的是找到所有奶牛都可到达的地方
2.建模:
①先通过vector建立一个有向图
②遍历图中每一个点,看是否能到达所有奶牛的居住地,答案加加
3.具体实现:
①存储图,直接套图论模板,vector:
vector<int>g[10005]; for(int i=1;i<=m;i++){ int u,v; cin>>u>>v; g[u].push_back(v); }
②遍历每一个点并进行dfs
③dfs写法,直接套图的遍历模板:
void dfs(int u){ vis[u]=1; mark[u]++; for(int i=0;i<g[u].size();i++){ int v=g[u][i]; if(vis[v]) continue; dfs(v); } }
AC code:
#include <bits/stdc++.h>
using namespace std;
vector<int>g[10005];
int q1,s,n,c,m,vis[10005];
int mark[10005],ans=0;
void dfs(int u){
vis[u]=1;
mark[u]++;
for(int i=0;i<g[u].size();i++){
int v=g[u][i];
if(vis[v]) continue;
dfs(v);
}
}
int main()
{
int k,n,m;
cin>>k>>n>>m;
int v[1005]={};
for(int i=1;i<=k;i++){
cin>>v[i];
}
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
g[u].push_back(v);
}
for(int i=1;i<=k;i++){
dfs(v[i]);
memset(vis,0,sizeof(vis));
}
for(int i=1;i<=n;i++){
if(mark[i]==k) ans++;
}
cout<<ans;
return 0;
}