拿到一看就想到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;
}
京公网安备 11010502036488号