编程练习:与节点i距离为k的节点

//用n*n的矩阵a表示有向图的邻接表,其中
//a[i,j] 1:结点i到j有边  0:结点i到j无边
//编写函数,给定节点i和步长k,计算节点i经k步能到达的所有节点
#include<stdio.h>
#define n 7
int GetNode(int x[][n],int start,int k) {//起点 距离,二维数组指定列数
	int dis[n]= {0};
	int i,j,count,num,max;
	count=n-1;//与起点距离为0的点的个数
	for(i=0; i<n; i++) {//与起点相邻的节点 距离都为1,作为每次新起点
		if(x[start][i]==1) {
			dis[i]=1;
			count--;
		}
	}
	num=1;//num不能从0开始,因为与初始起点最开始距离都为0,在下面循环中的判断语句if(x[i][j]==1&&dis[j]==0)中会出错
	max=0;//num表示与初始起点的距离,max表示与初始起点的最大距离
	while(count>0&&max<k) {
		for(i=0; i<n; i++) {//每轮新起点
			if(dis[i]==num) {//每轮找到的新起点与最初起点的距离+1
				for(j=0; j<n; j++) {
					if(x[i][j]==1&&dis[j]==0) {
						dis[j]=dis[i]+1;//在新起点与最开始起点距离的基础上+1
						count--;
						if(dis[j]>max) { //更新距离数组中的最大距离
							max=dis[j];
						}
					}
				}
			}
		}
		num++;
	}
	if(count==0&&max<k) { //不存在与i距离为k的节点
		printf("不存在与 %c 距离为 %d 的节点",start+'A',k);
		return 0;
	}
	for(i=0; i<n; i++) {
		if(dis[i]==k) {
			printf("起点 %c 经过 %d 步可以到达节点 %c\n",start+'A',k,i+'A');
		}
	}
}
int main() {
	int dis,s,a[n][n]= {{0,1,0,0,0,0,0},{0,0,1,0,0,0,1},{0,0,0,1,0,0,0},{0,0,0,0,1,0,0},{0,0,0,0,0,1,0},{0,0,0,0,0,0,1},{0,0,0,0,0,0,0}};
	scanf("%d",&dis);
	while(dis<1||dis>=n) {
		scanf("%d",&dis);
	}
	s=0;//s为起点下标
	GetNode(a,s,dis);
	return 0;
}
发布了78 篇原创文章 · 获赞 31 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_37209590/article/details/104460086