UVa 336 - A Node Too Far

题目:统计从某一点出发,走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;
}

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值