列表

详情


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;
}

上一题