题目连接
题意:
给你一没有回路的连通图,标记为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 */