//用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;
}
编程练习:与节点i距离为k的节点
猜你喜欢
转载自blog.csdn.net/qq_37209590/article/details/104460086
今日推荐
周排行