⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nettree.c

📁 单片机程序设计基础 随书光盘
💻 C
字号:
//网络的最小生成树算法(利用邻接矩阵)。
//
//              A
//            / | \
//        4 /   |   \ 7
//        /     |     \
//      B      6|       C
//      | \ 9   |   8 / |
//      |   \   |   /   |
//      |     \ | /     |
//     8|       D       |5
//      |     / | \ 3   | 
//      |  5/   |   \   | 
//      | /     |     \ | 
//      E      4|       F 
//       \      |      /
//         \    |    /  
//        2  \  |  / 9
//              G
//
//

#define N  7  //图的顶点数
#define MAX 9999  //一个远大于边长的数
char DOT[N]={'A','B','C','D','E','F','G'};//存放顶点信息的数组
char visited[N];	//存放顶点被访问标志
int  len[N];		//边长数组
char  F[N];		//父节点

//网络的邻接矩阵(MAX表示不相邻):
int NET[N][N] ={{0,4,7,6,MAX,MAX,MAX},
		{4,0,MAX,9,8,MAX,MAX},
		{7,MAX,0,8,MAX,5,MAX},
		{6,9,8,0,5,3,4},
		{MAX,8,MAX,5,0,MAX,2},
		{MAX,MAX,5,3,MAX,0,9},
		{MAX,MAX,MAX,4,2,9,0}};

void MINTREE ( int k ) //从序号为k的顶点出发构造网络的最小生成树
{
	int i,j,p,min;
	for (i=0;i<N;i++) visited[i]=0;//初始化访问标志
	visited[k] = 1 ; //首先将序号为k的顶点加入最小生成树
	for (i=0;i<N;i++) F[i] = (i==k)?'*':DOT[k] ;	//初始化父节点
	for (i=0;i<N;i++) len[i] = NET[k][i] ;	//初始化边长数组
	for (i=0;i<N-1;i++) {  //将其它N-1个顶点加入到最小生成树中
		min=MAX;p=-1;  //寻找到当前生成树最近的顶点
		for (j=0;j<N;j++) if (!visited[j] && len[j] <min ){
			min = len[j] ; p = j ;
			}
		visited[p] = 1 ; //将该顶点加入最小生成树
		for (j=0;j<N;j++) //调整其它顶点到最小生成树的边长
			if ( !visited[j] && NET[j][p] < len[j] ) {
				len[j]=NET[j][p];//更短的边长
				F[j]=DOT[p];  //新的父节点
				}
		}
}
//求解结果(本网络的最小生成树是唯一的,与根节点的选择无关):
//              A
//            / |  
//        4 /   |      
//        /     |      
//      B      6|       C
//              |       |
//              |       |
//              |       |
//              D       |5
//              | \ 3   | 
//              |   \   | 
//              |     \ | 
//      E      4|       F 
//       \      |       
//         \    |       
//        2  \  |     
//              G
//
//

main ( )
{
	int  i,j;
	for (i=0;i<N;i++)
		MINTREE (i) ; //从序号为i的顶点出发构造网络的最小生成树
	while (1) ; //在这一行设置断点,中止程序运行,以便观察程序运行的结果 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -