拿到一看就想到dfs,结果爆栈了。仔细想一下,题目上要找的是与点x距离为2的点,那么我们先找到与点x距离为1的点,距离为1的点与x,及其他点如a,b,c相连,a,b,c与x的距离即为2.

#include <bits/stdc++.h>

using namespace std;
vector<int> ed[200010];
int sum;
int main()
{
    int n;
    scanf("%d",&n);
    for(int i = 0;i < n - 1;++i)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        ed[u].push_back(v);ed[v].push_back(u);
    }
    //printf("%d\n",ed[1][0]);
    for(int i = 1;i <= n;++i)
    {
        sum = 0;
        for(int j = 0;j < ed[i].size();++j)
        {
            int m = ed[i][j];
            sum += ed[m].size() - 1;
        }
        printf("%d\n",sum);
    }
    return 0;
}

但实际上我还用前向星写了一个,不过不知道为什么还是显示段错误,代码放在这里希望有大佬可以帮我解答。

#include <bits/stdc++.h>

using namespace std;
int head[300010];
int cnt;
void init(int n)
{
    cnt = 0;///注意
    memset(head,-1,sizeof(head));
}
struct node
{
    int v,next;
}ed[300010];
void add(int u,int v)
{
    ed[cnt].v = v;
    ed[cnt].next = head[u];
    head[u] = cnt++;
}
int sum;
int main()
{
    int n;
    scanf("%d",&n);
    init(n);
    for(int i = 0;i < n - 1;++i)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        add(u,v);add(v,u);
    }
    for(int i = 1;i <= n;++i)
    {
        sum = 0;
        for(int j = head[i];~j;j = ed[j].next)
        {
             int p = ed[j].v;
             for(int k = head[p];~k;k = ed[k].next)
             {
                 if(ed[k].v != i) sum++;
             }
        }
        printf("%d\n",sum);
    }
    return 0;
}