PAT 1076 一个超时

1:二维数组无法用memset初始化,不过默认int[][]数组都为0,也没关系

//memset(relation, 0, sizeof(relation));//二维数组无法用memeset初始化,可init(n)
void init(int n){
	int i,j;
	for(i = 1; i<=n; i++){
		for(j = 1; j<=n; j++){
			relation[i][j] = 0;
		}
	}
}

2:memset参数位置别写错了!

memset(visited, 0, sizeof(visited));//memset(visited, sizeof(visited), 0);//第二个和第三个参数写倒了!竟然也不出错

3:判断level 增加的正确方法,确定每层最右边的结点:

if(u == rightest){			
	curLevel++;	
	if(!Q.empty()){
		rightest = Q.back();
	}
}



#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;//withou this queue can't be identified

int relation[1000+5][1000+5];
int visited[1000+5];
int n;//customer number 1,...,n
int level;//level constraint

void init(int n){
	int i,j;
	for(i = 1; i<=n; i++){
		for(j = 1; j<=n; j++){
			relation[i][j] = 0;
		}
	}
}

int bfs(int cur){

	int i;
	int res = 0;
	queue<int> Q;
	Q.push(cur);

	int curLevel = 0;

	int rightest = cur;//队尾是当前level的最后一个

	while(!Q.empty() && curLevel < level){
		int u = Q.front();//没有Q.poll!
		Q.pop();	

		for(i = 1; i <= n; i++){
			if(i == u){
				continue;
			}
			if(relation[i][u] == 1 && visited[i] == 0){
				Q.push(i);
				visited[i] = 1;

				//test
				//printf("father =%d and cur=%d\n",u,i);
				res++;

				 
			}	
		}

		if(u == rightest){			
			curLevel++;	
			if(!Q.empty()){
				rightest = Q.back();
			}
		}

		
	}
	
	return res;
}

int main(){

	freopen("in.txt","r",stdin);	

	int i;
	int cnt;
	scanf("%d %d",&n, &level);

	//memset(relation, 0, sizeof(relation));//二维数组无法用memeset初始化,可init(n)
	//init(n);
	memset(visited, 0, sizeof(visited));//memset(visited, sizeof(visited), 0);//第二个和第三个参数写倒了!竟然也不出错
	

	for(i = 1; i <= n; i++){		
		scanf("%d", &cnt);
		while(cnt-- > 0){
			int follow;
			scanf("%d",&follow);
			relation[i][follow] = 1;
		}
	}

	scanf("%d",&cnt);

	while(cnt-- > 0){
		int cur;
		scanf("%d", &cur);

		memset(visited, 0, sizeof(visited));
		
		visited[cur] = 1;

		printf("%d",bfs(cur));

		if(cnt > 0){
			printf("\n");
		}
	}


	return 0;
}


你可能感兴趣的:(PAT 1076 一个超时)