NC19767. GJX的爸爸
描述
由于GJX很皮,所以他经常被锤爆(▼ヘ▼#)。这使得他不得不认很多人为爸爸 ( ̄▽ ̄)/。但是同时,GJX爸爸的爸爸以及他爸爸的爸爸的爸爸等也顺理成章地成为了GJX的爸爸。某一位不愿意透露姓名的010110000100000101010001同学冒死搞到了一份亲戚关系图,关系图中共有n个人,m条关系,且包含了所有和GJX有关的关系。现在,请机智的你告诉我,GJX究竟有多少个爸爸。(GJX的编号为1)
输入描述
第一行,2个数n,m,分别代表关系图中的人数、关系数。
接下来m行,每行2个数p,q,代表q是p的爸爸。
输出描述
一行,1个数s,代表GJX的爸爸数量。
示例1
输入:
6 6 1 2 3 1 1 4 1 5 2 6 5 6
输出:
4
C++14(g++5.4) 解法, 执行用时: 972ms, 内存消耗: 28760K, 提交时间: 2019-10-07 15:51:41
#include<cstdio> using namespace std; int head[1000010],ne[2000010],to[2000010],cnt=0; void add(int u,int v){ cnt++; to[cnt]=v; ne[cnt]=head[u]; head[u]=cnt; } int n,m,ans=0; bool vis[1000010]={0}; void dfs(int r){ vis[r]=1; for(int i=head[r];i!=-1;i=ne[i]){ if(vis[to[i]]==0){ ans++; dfs(to[i]); } } } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)head[i]=-1; int x,y; for(int i=1;i<=m;i++){ scanf("%d%d",&x,&y); add(x,y); } dfs(1); printf("%d",ans); return 0; }
C++(g++ 7.5.0)(g++7.5.0) 解法, 执行用时: 904ms, 内存消耗: 103056K, 提交时间: 2023-02-28 22:38:40
#include<cstdio> #include<vector> using namespace std; const int N = 1001000; vector<int> dad[N]; bool vis[N]; int dfs(int root) { int i, u; vis[root] = true; int ret = 0; for(i = 0; i < dad[root].size(); i++) { u = dad[root][i]; if(!vis[u]) ret += dfs(u); } return ret + 1; } int main() { int i,m,n; int p,q; scanf("%d%d", &n, &m); while(m--) { scanf("%d%d", &p, &q); dad[p].push_back(q); } printf("%d\n", dfs(1)-1); return 0; }
C++ 解法, 执行用时: 901ms, 内存消耗: 90416K, 提交时间: 2021-09-14 21:49:25
#include<bits/stdc++.h> using namespace std; const int MAXN=1e6+5; int n,m,ans=-1; vector<int>e[MAXN],vis(MAXN); void dfs(int x){ if(vis[x])return; vis[x]=1; ans++; for(auto v:e[x])dfs(v); } int main() { std::ios::sync_with_stdio(false),cin.tie(0); cin>>n>>m; for(int u,v;m--;){ cin>>u>>v; e[u].push_back(v); } dfs(1); cout<<ans<<'\n'; return 0; }