hdu~4707(vector)

来源:互联网 发布:mysql update 自关联 编辑:程序博客网 时间:2024/05/21 10:03

题目连接


题意:

给你一没有回路的连通图,标记为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;}/*110 20 10 20 31 41 52 63 74 86 9Sample Output2*/











0 0