暑假集训 8.16 sdutoj3642 判断给定森林中有多少棵树特别版 (简单考查邻接表)

该博客介绍了如何使用邻接表解决一个关于森林中特定树木计数的问题。题目要求在限制的时间和内存条件下,通过输入数据判断森林中满足条件的树的数量。博主提供了利用邻接表存储图的方法,并指出使用矩阵可能会导致内存超出。示例输入和输出帮助理解题意,代码已AC。
摘要由CSDN通过智能技术生成

判断给定森林中有多少棵树特别版

Time Limit: 1000ms   Memory limit: 65536K 

题目描述

 众人皆知,在编程领域中,C++是一门非常重要的语言,不仅仅因为其强大的功能,还因为它是很多其他面向对象语言的祖先和典范。不过这世上几乎没什么东 西是完美的,C++也不例外,多继承结构在带来强大功能的同时也给软件设计和维护带来了很多困难。为此,在java语言中,只允许单继承结构,并采用接口 来模拟多继承。KK最近获得了一份java编写的迷你游戏的源代码,他对这份代码非常感兴趣。这份java代码是由n个类组成的(本题不考虑接口),n个类分别用数字1..n表示。现在给你n个类之间的关系,有q次询问,每次询问某一个有多少个直接继承的子类。输入子类的个数和标号(标号按照字典序大小输出)。

输入

首先输入一个整数T,表示数据的组数。每组数据格式如下。
第一行包含两个整数n,m,表示该份代码中的n个类和m个单继承关系(1<=m<n<=10^5)

输出

 对于每组输入。输出询问类的子类的数量和编号。

示例输入

1
10 9
2 1
3 2
4 3
5 3
6 3
7 3
8 3
9 3
10 5
10
7
6
3
7
1
2
8
1
2
5

示例输出

0
0
6
4 5 6 7 8 9
0
1
2
1
3
0
1
2
1
3
1
10

邻接表存储图,然后询问的时候依次输出某个head[]中的元素就行了.....

用矩阵的话会爆内存;

不过题目描述和题目....

///ACcode

#include <bits/stdc++.h>

using namespace std;

const int maxn=100010;

typedef struct node
{
    int data;
    node *next;
} node,*Node;

///有序的邻接表插入函数...头指针的数据域代表"后面"一共有多少个元素
void Insert(Node &head,int x)
{
    Node q,a,tail; ///a是q的前驱节点 tail是要插入的节点

    tail=new node;
    tail->data=x;

    if (head==NULL)
    {
        head=new node;
        head->data=1;  ///初始为 1

        head->next=tail;
        tail->next=NULL;
    }
    else if (head!=NULL)
    {
        head->data++; ///链的 数据个数++

        a=head; ///前驱
        q=head->next;
        while (q)
        {
            if (q->data > x)
            {
                a->next=tail;
                tail->next=q;
                break; ///从小到大排序 遇到大的就插入 然后一定要跳出while
            }
            a=a->next;
            q=q->next;
        }
        if (q==NULL)  ///没找到比x大的 所以把x放在最后
        {
            a->next=tail;
            tail->next=NULL;
        }
    }
}

int main()
{
    int n,m,i;
    int u,v;
    int key;
    int t;
    Node head[maxn],tail;

    cin>>t;
    while (t--)
    {
        cin>>n>>m;
        for (i=1; i<=n; i++) ///初始化
        {
            head[i]=NULL;
        }
        for (i=1; i<=m; i++)
        {
            cin>>u>>v;
            Insert(head[v],u); ///将u的数据插入到v的节点中
        }
        int q;
        cin>>q;
        for (i=1; i<=q; i++)
        {
            cin>>key;
            if (head[key]==NULL)
            {
                cout<<"0"<<endl;
            }
            else
            {
                cout<<head[key]->data<<endl;
                tail=head[key]->next;
                while (tail)
                {
                    cout<<tail->data;
                    if (tail->next!=NULL)
                    {
                        cout<<" ";
                    }
                    tail=tail->next;
                }
                cout<<endl;
            }
        }
    }
    return 0;
}

有关的邻接表传送门   http://blog.csdn.net/gentle_guan/article/details/52214869


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值