您的位置:首页 > 其它

hdu~4707(vector)

2015-09-04 19:55 381 查看
题目连接

题意:

给你一没有回路的连通图,标记为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
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: