hdu~4707(vector)

题目连接


题意:

给你一没有回路的连通图,标记为0~n-1,相邻边的权值为1,找出距离 点0 大于m的点的个数.

输入n  m , n-1条边.(理解了题意+vector 这道题就很水了)


据说这道题的题目很水,直接用num[y]=num[x]+1(输入一条边 X Y)都能过,我也是醉了.

然而这些都是歪门邪道,让我们来看看正确的解法:

首先N<10^5,MAX=10^5.

如果用floyd最短路做的话是开不了那么大的数组num[MAX][MAX]的.

这个时候只需要开一个vector<int > num[MAX],因为vector里面的空间是可变化的,

输入n条边后,num最大只用了2*MAX个空间.(之前num[MAX][MAX]开了MAX*MAX个空间).

所以就能做了,具体请看代码,直接遍历:

#include <stdio.h>
#include <vector>

using namespace std;
const int MAX = 100000;
int main()
{
    int T,n,m,x,y;
    scanf("%d",&T);
    while(T--){
    //num[x] :记录了与x相连的边有哪些
        vector<int > num[MAX];  //这类似一个二维数组 num[MAX][变化的]
        scanf("%d %d",&n,&m);
        for(int i=1;i<n;++i){   
            scanf("%d %d",&x,&y);
            num[x].push_back(y);
        }
        int sign[MAX] = {0};
        for(int i=0;i<n;++i)  //与i相邻的点的距离就是sign[i]+1
            for(int j=0;j<num[i].size();++j)
                sign[num[i][j]]=sign[i]+1;
        int ans=0;
        for(int i=0;i<n;++i)    //记录距离大于m的点的个数
            if(sign[i]>m) ans++;
        printf("%d\n",ans);
    }
    return 0;
}
/*
1
10 2
0 1
0 2
0 3
1 4
1 5
2 6
3 7
4 8
6 9

Sample Output

2
*/











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值