题目:统计从某一点出发,走k步走不到的节点个数。
分析:最短路、bfs、队列。利用bfs扩展的节点就是按照步长的递增序扩展。
注意:数组开大会TLE、开小会RE。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct lnode
{
int point;
lnode *next;
}lnode;
lnode Node[ 10000 ];
lnode* Head[ 10000 ];
int Count;
void addlist( int a, int b )
{
Node[ Count ].point = b;
Node[ Count ].next = Head[ a ];
Head[ a ] = &Node[ Count ++ ];
}
int H[ 10000 ];
int Q[ 10000 ];
int S[ 10000 ];
int U[ 10000 ];
int bfs( int s, int d, int m )
{
memset( U, 0, sizeof(U) );
U[s] = 1;
S[s] = 0;
Q[0] = s;
int move = 0,save = 1;
while ( move < save ) {
int now = Q[move ++];
if ( S[now] >= d ) break;
for ( lnode *p = Head[now] ; p ; p = p->next )
if ( !U[p->point] ) {
U[p->point] = 1;
S[p->point] = S[now]+1;
Q[save++] = p->point;
}
}
int sum = 0;
for ( int i = 0 ; i <= m ; ++ i )
if ( H[i] && !U[i] )
++ sum;
return sum;
}
int main()
{
int n,a,b,s,d,c = 1;
while ( scanf("%d",&n) && n ) {
memset( Head, 0, sizeof(Head) );
memset( H, 0, sizeof(H) );
Count = 0;
int M = 0;
for ( int i = 1 ; i <= n ; ++ i ) {
scanf("%d%d",&a,&b);
addlist( a, b );
addlist( b, a );
if ( a > M ) M = a;
if ( b > M ) M = b;
H[a] = H[b] = 1;
}
while ( scanf("%d%d",&s,&d) && s ) {
printf("Case %d: %d nodes not reachable from node %d with TTL = %d.\n",\
c ++,bfs(s,d,M),s,d);
}
}
return 0;
}