这个终于正确了
#include<iostream>
using namespace std;
#define MAX_VERTEX_NUM 20//最大顶点数
#define QM 100//最大值
#define OK 1
#define ERROR 0
int visited[MAX_VERTEX_NUM];
typedef int VertexType;
typedef int VRType;
typedef struct ArcCell
{
int adj;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct
{
VertexType vexs[MAX_VERTEX_NUM];//顶点向量
AdjMatrix arcs;//邻接矩阵
int vexnum,arcnum;//图的当前顶点数和弧数
}MGraph;
typedef struct
{
VertexType adjvex;
VRType lowcost;
}closedge [MAX_VERTEX_NUM];
int LocateVex(MGraph &G,VertexType v)//确定顶点位置
{
int k;
for(k=0;k<G.vexnum;k++)
{
if(G.vexs[k]==v)
return k;
}
return -1;//没有这个顶点
}
int CreateUDN(MGraph &G)//创建无向网
{
int i,j,k;
int weight;
VertexType v1,v2;
cout<<"输入无向图的顶点数和弧数:";
cin>>G.vexnum>>G.arcnum;
for(i=0;i<G.vexnum;++i)
for(j=0;j<G.vexnum;++j)
G.arcs[i][j].adj=QM;
cout<<"输出网的"<<G.vexnum<<"个顶点(限数字):";
for(i=0;i<G.vexnum;i++)
cin>>G.vexs[i];
cout<<"建立弧,请输入"<<G.arcnum<<"条弧的顶点和权值(v1,v2,w):";
for(k=0;k<G.arcnum;k++)
{
cin>>v1>>v2>>weight;
i=LocateVex(G,v1);
j=LocateVex(G,v2);
if(i<0||j<0)
return ERROR;
G.arcs[i][j].adj=weight;
G.arcs[j][i].adj=G.arcs[i][j].adj;
}
return OK;
}
void PrintMatrix(MGraph &G)//输出邻接矩阵
{
int i,j;
printf("邻接矩阵为:/n");
for(i=0;i<G.vexnum;i++)
{
for(j=0;j<G.vexnum;j++)
cout<<G.arcs[i][j].adj<<" ";
cout<<endl;
}
}
int minimun(MGraph G,closedge F)
{
int i,min;
for(i=0;i<G.vexnum;i++)
if(F[i].lowcost!=0) break;
min=i;
for(i=0;i<G.vexnum;i++)
if(F[i].lowcost!=0 &&F[i].lowcost<F[min].lowcost)
min=i;
return min;
}
void MiniSpanTree_PRIM(MGraph G,VertexType u)
{
closedge dge; //申请数组
int k,j,i;
k=LocateVex(G,u); //确定初始结点的下标
for(j=0;j<G.vexnum;++j) //初始化临时辅助数组
if(j!=k)
{
dge[j].lowcost=G.arcs[k][j].adj; //数组中的adjvex均为u,即从u开始到所有其他结点的权值赋给了数组中lowcost
dge[j].adjvex=u; //数组中的下标起箭头的作用,即它是边的第二个尾结点!
}
dge[k].lowcost=0; //u在数组dge的下标即为k,故自身到自身权值标为0,也表示纳入点集V!
for(i=1;i<G.vexnum;++i)
{
k=minimun(G,dge); // 在dge数组中找到最小的一条边,并返回尾结点的下标!
cout<<"K的寻求结果为:"<<k<<endl;
cout<<dge[k].adjvex<<" "<<G.vexs[k]<<" "<<endl; //输出边
dge[k].lowcost=0; //把下标为k的结点纳入点集V!标注权值为0!
for(j=0;j<G.vexnum;++j)
if(G.arcs[k][j].adj<dge[j].lowcost)
{ //新加入的点到其他各点的权值比原来的权值更小,则替换!采取遍历的方法!
dge[j].lowcost=G.arcs[k][j].adj;
dge[j].adjvex=G.vexs[k]; //点的名字显然也该改!
}
}
}
void main()
{
MGraph G;
VertexType u;
G.vexnum=G.arcnum=0;
CreateUDN(G);
cout<<"请输入要开始的点:";
cin>>u;
MiniSpanTree_PRIM(G,u);
}