|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
输出都是0,不知道错哪了,请指教!
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define MAXVEX 100
#define INFINITY 65535
typedef struct{
char vexs[MAXVEX]; //顶点表
int arc[MAXVEX][MAXVEX]; //邻接矩阵
int numVertexes,numEdges; //图中当前的顶点数和边数
}MGraph;
//建立无向网图的邻接矩阵
void CreateMGraph(MGraph*G)
{
int i,j,k,w;
cin>>G->numVertexes>>G->numEdges;
//输入顶点
for(i=0;i<G->numVertexes;i++)
{
cin>>G->vexs[i];
}
//初始化邻接矩阵
for(i=0;i<G->numVertexes;i++)
{
for(j=0;j<G->numVertexes;j++)
{
G->arc[i][j]=INFINITY;
}
}
for(k=0;k<G->numEdges;k++)
{
//输入点,点和对应的权值
cin>>i>>j>>w;
G->arc[i][j]=w;
G->arc[j][i]=w;
}
}
void MiniSpanTree_Prim(MGraph G)
{
int min,i,j,k;
int adjvex[MAXVEX]; //保存相关顶点下标
int lowcost[MAXVEX]; //保存相关顶点间边的权值
lowcost[0]=0; //v0作为最小生成树的根开始遍历,权值为0
adjvex[0]=0; //v0第一个加入
//初始化操作 将邻接矩阵第0行所有权值先加入数组
for(i=1;i<G.numVertexes;i++)
{
lowcost[i]=G.arc[0][i];
adjvex[i]=0; //初始化全部为v0的下标
}
//真正构建最小生成树的过程
for(i=1;i<G.numVertexes;i++)
{
min=INFINITY;
j=1;
k=0;
//遍历全部顶点
while(j<G.numVertexes)
{
//找出lowcost数组已存储的最小权值
if(lowcost[j]!=0&&lowcost[j]<min)
{
min=lowcost[j];
k=j; //将发现的最小权值的下标存入k,以待使用
}
j++;
}
//打印当前顶点边中权值最小的边
cout<<adjvex[k]<<k<<endl;
lowcost[k]=0; //将当前顶点的权值设置为0,表示此顶点已经完成任务,进行下一个顶点的遍历
//邻接矩阵k逐个遍历全部顶点
for(j=1;j<G.numVertexes;j++)
{
if(lowcost[j]!=0&&G.arc[k][j]<lowcost[j])
{
lowcost[j]=G.arc[k][j];
adjvex[j]=k;
}
}
}
}
int main()
{
MGraph G;
CreateMGraph(&G);
MiniSpanTree_Prim(G);
return 0;
}
|
|