Prim算法
来源:互联网 发布:北京网络作家协会 编辑:程序博客网 时间:2024/05/16 14:35
#include<iostream.h>
const int n=3; //图的顶点数,应由用户定义
typedef int adjmatrix[n][n]; //用二维数组作为邻接矩陈表示
typedef struct{ //生成树的边结点
int fromvex,endvex; //边的起点与终点
int weight; //边上的权
}TreeEdgeNode;
typedef TreeEdgeNode edgeset[n-1]; //最小生成树定义
void Prim(adjmatrix GA,edgeset &CT,int n)//注意这里的参数CT是写成edgeset CT还是edgeset &CT呢,经过实践发现,两种写法都是可以的,我想这应该是因为我们这里定义的edgeset[n-1]是全局变量的缘故。
//利用普里姆算法从顶点v0出发求出用邻接矩阵GA表示的图的最小生成树,
//最小生成树的边集存于数组CT中
{
//给CT赋初值。
int i,j,k,min,t,m,w;
for(i=0;i<n-1;i++)
{
CT[i].fromvex=0;
CT[i].endvex=i+1;
CT[i].weight=GA[0][i+1];
}
//进行n-1循环,每次求出最小生成树中的第k条边
for(k=1;k<n;k++)
{
//从CT[k-1]至CT[n-1]中查找最短边CT[m]
min=CT[k-1].weight;//先假设CT[k-1]为最短边
m=k-1;
for(j=k;j<n-1;j++)
if(CT[j].weight<min)
{
min=CT[j].weight;
m=j;
}
//把最短边调到k-1下标的位置
TreeEdgeNode temp=CT[k-1];
CT[k-1]=CT[m];
CT[m]=temp;
//把新并入最小生成树T中的顶点的顶点序号赋值给j
j=CT[k-1].endvex;
//修改LW中的有关边,使T中到T外的每一个顶点各保持一条到目前为止最短边
for(i=k;i<n-1;i++)
{
t=CT[i].endvex;
w=GA[j][t];
if(w<CT[i].weight)
{
CT[i].weight=w;
CT[i].fromvex=j;
}
}
}
}
void main()
{
int i,j;
adjmatrix adj;//注意:adjmatrix[n][n]是自定义数据类型
edgeset CT;//注意:edgeset[n-1]是自定义数据类型
cout<<"请输入图的邻接矩陈阵"<<endl;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
cin>>adj[i][j];
}
Prim(adj,CT,n);//注意参数的传递方法,自定义数据类型就像系统定义的一样,如 int a,传参跟这个一样。
cout<<"最小生成树的边集如下:"<<endl;
for(i=0;i<n-1;i++)
cout<<"起点:"<<CT[i].fromvex<<" "<<"终点:"<<CT[i].endvex<<" "<<"权值:"<<CT[i].weight<<endl;
}
/*
测度用例一(先把n设为7)//提示,在DOS中点出鼠标右键就可以把这些测试数据一次性粘贴上去。
请输入图的邻接矩陈阵
0 8 100 5 100 100 100
8 0 12 3 10 100 100
100 12 0 100 6 2 100
5 3 100 0 100 7 15
100 10 6 100 0 9 100
100 100 2 7 9 0 100
100 100 100 15 100 100 0
最小生成树的边集如下:
起点:0 终点:3 权值:5
起点:3 终点:1 权值:3
起点:3 终点:5 权值:7
起点:5 终点:2 权值:2
起点:2 终点:4 权值:6
起点:3 终点:6 权值:15
Press any key to continue
测度用例二(先把n设为3)
请输入图的邻接矩陈阵
0 100 3
100 0 4
3 4 0
最小生成树的边集如下:
起点:0 终点:2 权值:3
起点:2 终点:1 权值:4
Press any key to continue
测度用例三(先把n设为3)
请输入图的邻接矩陈阵
0 5 3
5 0 4
3 4 0
最小生成树的边集如下:
起点:0 终点:2 权值:3
起点:2 终点:1 权值:4
Press any key to continue
*/
/*
http://f2.9612.org//vcpp/webinfo/WebInfoBata1.asp
QQ群:
34409541 讨论网页
34409326 讨论JAVA 已满
34408784 讨论VC++
34409699 讨论VC++
9143041 讨论MFC编程
10614204 讨论C#
10613030 讨论Win32编程
10613067 讨论游戏开发
18779860 讨论JAVA
*/
const int n=3; //图的顶点数,应由用户定义
typedef int adjmatrix[n][n]; //用二维数组作为邻接矩陈表示
typedef struct{ //生成树的边结点
int fromvex,endvex; //边的起点与终点
int weight; //边上的权
}TreeEdgeNode;
typedef TreeEdgeNode edgeset[n-1]; //最小生成树定义
void Prim(adjmatrix GA,edgeset &CT,int n)//注意这里的参数CT是写成edgeset CT还是edgeset &CT呢,经过实践发现,两种写法都是可以的,我想这应该是因为我们这里定义的edgeset[n-1]是全局变量的缘故。
//利用普里姆算法从顶点v0出发求出用邻接矩阵GA表示的图的最小生成树,
//最小生成树的边集存于数组CT中
{
//给CT赋初值。
int i,j,k,min,t,m,w;
for(i=0;i<n-1;i++)
{
CT[i].fromvex=0;
CT[i].endvex=i+1;
CT[i].weight=GA[0][i+1];
}
//进行n-1循环,每次求出最小生成树中的第k条边
for(k=1;k<n;k++)
{
//从CT[k-1]至CT[n-1]中查找最短边CT[m]
min=CT[k-1].weight;//先假设CT[k-1]为最短边
m=k-1;
for(j=k;j<n-1;j++)
if(CT[j].weight<min)
{
min=CT[j].weight;
m=j;
}
//把最短边调到k-1下标的位置
TreeEdgeNode temp=CT[k-1];
CT[k-1]=CT[m];
CT[m]=temp;
//把新并入最小生成树T中的顶点的顶点序号赋值给j
j=CT[k-1].endvex;
//修改LW中的有关边,使T中到T外的每一个顶点各保持一条到目前为止最短边
for(i=k;i<n-1;i++)
{
t=CT[i].endvex;
w=GA[j][t];
if(w<CT[i].weight)
{
CT[i].weight=w;
CT[i].fromvex=j;
}
}
}
}
void main()
{
int i,j;
adjmatrix adj;//注意:adjmatrix[n][n]是自定义数据类型
edgeset CT;//注意:edgeset[n-1]是自定义数据类型
cout<<"请输入图的邻接矩陈阵"<<endl;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
cin>>adj[i][j];
}
Prim(adj,CT,n);//注意参数的传递方法,自定义数据类型就像系统定义的一样,如 int a,传参跟这个一样。
cout<<"最小生成树的边集如下:"<<endl;
for(i=0;i<n-1;i++)
cout<<"起点:"<<CT[i].fromvex<<" "<<"终点:"<<CT[i].endvex<<" "<<"权值:"<<CT[i].weight<<endl;
}
/*
测度用例一(先把n设为7)//提示,在DOS中点出鼠标右键就可以把这些测试数据一次性粘贴上去。
请输入图的邻接矩陈阵
0 8 100 5 100 100 100
8 0 12 3 10 100 100
100 12 0 100 6 2 100
5 3 100 0 100 7 15
100 10 6 100 0 9 100
100 100 2 7 9 0 100
100 100 100 15 100 100 0
最小生成树的边集如下:
起点:0 终点:3 权值:5
起点:3 终点:1 权值:3
起点:3 终点:5 权值:7
起点:5 终点:2 权值:2
起点:2 终点:4 权值:6
起点:3 终点:6 权值:15
Press any key to continue
测度用例二(先把n设为3)
请输入图的邻接矩陈阵
0 100 3
100 0 4
3 4 0
最小生成树的边集如下:
起点:0 终点:2 权值:3
起点:2 终点:1 权值:4
Press any key to continue
测度用例三(先把n设为3)
请输入图的邻接矩陈阵
0 5 3
5 0 4
3 4 0
最小生成树的边集如下:
起点:0 终点:2 权值:3
起点:2 终点:1 权值:4
Press any key to continue
*/
/*
http://f2.9612.org//vcpp/webinfo/WebInfoBata1.asp
QQ群:
34409541 讨论网页
34409326 讨论JAVA 已满
34408784 讨论VC++
34409699 讨论VC++
9143041 讨论MFC编程
10614204 讨论C#
10613030 讨论Win32编程
10613067 讨论游戏开发
18779860 讨论JAVA
*/
- prim 算法
- Prim算法
- Prim算法
- prim算法
- Prim算法
- Prim算法。
- Prim 算法
- Prim算法
- prim算法
- Prim算法
- Prim算法
- Prim算法
- prim算法
- prim算法
- Prim算法
- Prim算法
- prim算法
- prim算法
- 诺基亚S60各机型对应的系统版本清单
- 【原创】Spring-bean的关联...
- 吃饭、睡觉和发呆是人生三件大事
- windows之内核对象
- Java反射机制
- Prim算法
- 随机取一些记录
- 网上招聘系统
- 少走弯路:学习编译原理的相关建议
- at91rm9200上u-boot移植
- Java与C#语法对比及转换
- 完美解读Linux中文件系统的目录结构
- 学计算机的女孩子向什么方向发展比较好?
- asp无组件上传的原理