kAri OJ 92 统计节点个数 邻接表

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

kAri OJ 92 统计节点个数 邻接表的相关文章

HDU 5441 Travel(并查集+统计节点个数)

http://acm.hdu.edu.cn/showproblem.php?pid=5441 题意:给出一个图,每条边有一个距离,现在有多个询问,每个询问有一个距离值d,对于每一个询问,计算出有多少点对(x,y)使得在x到y的路径上没有一条边的距离大于d. 思路:只要边距离小于d,那就是可行的,直接加入并查集来维护.并查集需要维护一下树的节点个数. 将边和询问都排序离线处理. 1 #include<iostream> 2 #include<cstdio> 3 #include<

BUPT复试专题—统计节点个数(2013)

题目描述 给出一棵有向树,一共有n个节点,如果一个节点的度(入度+出度)不小于它所有儿子以及它父亲的度(如果存在父亲或儿子),那么我们称这个节点为p节点,现在你的任务是统计p节点的个数. 如样例,第一组的p节点为1,2,3:第二组的p节点为0. 输入 第一行为数据组数T.每组数据第一行为表示树的节点数. 后面的行,每行两个数,代表节点编号和儿子节点的编号. 输出 每组数据输出一行,为一个整数,代表这棵树上p节点的个数. 样例输入 2 5 0 1 1 2 2 3 3 4 3 0 2 0 1 样例输

ACM/ICPC 之 数据结构-邻接表+DP+队列+拓扑排序(TshingHua OJ-旅行商TSP)

做这道题感觉异常激动,因为在下第一次接触拓扑排序啊= =,而且看了看解释,猛然发现此题可以用DP优化,然后一次A掉所有样例,整个人激动坏了,哇咔咔咔咔咔咔咔~ 咔咔~哎呀,笑岔了- -|| 旅行商(TSP) Description Shrek is a postman working in the mountain, whose routine work is sending mail to n villages. Unfortunately, road between villages is

图的邻接表表示

要完整地表示一个图,就需要明确图中有什么,很简单,节点和边. 所以,在用邻接表表示一个图的时候,我们需要分别表示其节点和边,然后用边将节点连接起来即可. 使用邻接表,文字上的描述就是,将所有节点放入一张邻接表中,对于每个节点的邻接节点,用一个链表将其连接起来. 1 邻接表中边.节点.图定义 1 typedef struct Edge 2 { 3 int adjvex; 4 struct Edge *nextEdge; 5 }Edge; 6 //顶点表 7 typedef struct VNode

先序遍历创建二叉树,对二叉树统计叶子节点个数和统计深度(创建二叉树时#代表空树,序列不能有误)

#include "stdio.h" #include "string.h" #include "malloc.h" #define NULL 0 #define MAXSIZE 30 typedef struct BiTNode      //定义二叉树数据结构 { char data; struct BiTNode *lchild,*rchild; } BiTNode; void preCreate(BiTNode *& T)   /

第四章第4节 二叉树特殊节点个数统计

为了方便说明二叉树的递归传值过程,这里首先给出一个基本的二叉树结构. 图中值为NULL的节点实际是不存在的,故与父亲节点之间的连接用灰色的虚线表示.只是为了便于说明,才假设了一个NULL的空节点. 以下图中,黄色的线表明了传值的方向:绿色的数值表明了子节点传到父亲节点时的值,即根据递归公式计算便可. 一.统计二叉树中度为0的节点个数(递归/非递归) 递归方式实现 二叉树中,度为0则表明该节点的左孩子.右孩子均为空,根据二叉树的特性,最容易想到的便是采用递归方式实现该答案.首先列出基本递归公式:

PAT甲题题解-1004. Counting Leaves (30)-统计每层叶子节点个数+dfs

统计每层的叶子节点个数建树,然后dfs即可 #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <vector> using namespace std; /* 统计每层的叶子节点个数 建树,然后dfs即可 */ const int maxn=105; int n,m; int layer[maxn]; //统计每层的叶子节点

ZSTU OJ 3999 零基础学算法---邻接表

题目:Click here 题意:我就喜欢中文题! 分析:这个题虽然是中文题,但是还是有一点费解的.其实就是给你一棵树,是用图的形式给你的,只知道a,b之间有一条边,并不知道谁是父,谁是子.思路就是先把这个无向图用邻接表存下来,再转成有向图,最后dfs回答每一条询问.(的确有点麻烦,并且这次使用vector实现的邻接表,学长教的有点难懂,近期更新上来) 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring&

数据结构学习笔记05图 (邻接矩阵 邻接表--&gt;BFS DFS)

数据结构之图 图(Graph) 包含 一组顶点:通常用V (Vertex) 表示顶点集合 一组边:通常用E (Edge) 表示边的集合 边是顶点对:(v, w) ∈E ,其中v, w ∈ V 有向边<v, w> 表示从v指向w的边(单行线) 不考虑重边和自回路 无向图:边是无向边(v, w) 有向图:边是有向边<v, w> 连通:如果从V到W存在一条(无向)路径,则称V和W是连通的 连通图(Connected Graph):如果对于图的任一两个顶点v.w∈V,v和w都是连通的,则称