当前位置: 代码迷 >> 综合 >> BUPT OJ92 统计节点个数
  详细解决方案

BUPT OJ92 统计节点个数

热度:45   发布时间:2024-01-12 05:30:00.0

题目描述

给出一棵有向树,一共有 N ( 1<N1000 )个节点,如果一个节点的度(入度+出度)不小于它所有儿子以及它父亲的度(如果存在父亲或儿子),那么我们称这个节点为p节点,现在你的任务是统计p节点的个数。

如样例,第一组的p节点为1,2,3;第二组的p节点为0。

输入格式

第一行为数据组数 T ( 1T100 )。
每组数据第一行为 N 表示树的节点数。后面为 N?1 行,每行两个数 x , y ( 0x,y<N ),代表 y x 的儿子节点。

输出格式

每组数据输出一行,为一个整数,代表这棵树上p节点的个数。

输入样例

2
5
0 1
1 2
2 3
3 4
3
0 2
0 1

输出样例

3
1

判断有些繁琐了,不太满意。本来想写邻接表的,还是觉得邻接矩阵好写


 

/*
USER_ID: test#birdstorm
PROBLEM: 92
SUBMISSION_TIME: 2014-03-01 17:54:23
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define For(i,m,n) for(i=m;i<n;i++)
#define MAX(x,y) (x)>(y)?(x):(y)
#define MAXN 1005int cnt[MAXN],edge[MAXN][MAXN];main()
{int i, j, n, t, x, y, ans, temp;scanf("%d",&t);while(t--){memset(cnt,0,sizeof(cnt));memset(edge,0,sizeof(edge));ans=0;scanf("%d",&n);For(i,0,n-1){scanf("%d%d",&x,&y);cnt[x]++; cnt[y]++;edge[x][y]=edge[y][x]=1;}For(i,0,n){temp=0;For(j,0,n) if(edge[i][j]&&i!=j) temp=MAX(temp,cnt[j]);ans+=cnt[i]>=temp;}printf("%d\n",ans);}return 0;
}