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  
*/