拿到一看就想到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; }