92. 统计节点个数
时间限制
1000 ms 内存限制 65536 KB
题目描述
给出一棵有向树,一共有N(1<N≤1000)个节点,如果一个节点的度(入度+出度)不小于它所有儿子以及它父亲的度(如果存在父亲或儿子),那么我们称这个节点为p节点,现在你的任务是统计p节点的个数。
如样例,第一组的p节点为1,2,3;第二组的p节点为0。
输入格式
第一行为数据组数T(1≤T≤100)。
每组数据第一行为N表示树的节点数。后面为N?1行,每行两个数x,y(0≤x,y<N),代表y是x的儿子节点。
输出格式
每组数据输出一行,为一个整数,代表这棵树上p节点的个数。
输入样例
2
5
0 1
1 2
2 3
3 4
3
0 2
0 1
输出样例
3
1
#include<stdio.h> #include<stdlib.h> int head[1001],du[1001],k; typedef struct Edge { int v,next; }Edge; Edge edge[2002]; void addEdge(int u,int v) { edge[k].v=v; edge[k].next=head[u]; head[u]=k++; } int main() { int t; while(~scanf("%d",&t)) { while(t--) { int n,i,j; scanf("%d",&n); k=0; for(i=0;i<=n;i++) { head[i]=-1; du[i]=0; } for(i=0;i<n-1;i++) { int u,v; scanf("%d%d",&u,&v); addEdge(u,v); addEdge(v,u); du[u]++; du[v]++; } int sum=0; for(i=0;i<n;i++) { int flag=0; for(j=head[i];j!=-1;j=edge[j].next) { int v=edge[j].v; if(du[i]<du[v]) { flag=1; break; } } if(!flag) sum++; } printf("%d\n",sum); } } return 0; }
时间: 2024-12-28 09:53:17