小蓝的程序猿生活 2021-05-30 17:38 采纳率: 50%
浏览 27

最小生成树—普里姆算法,for循环不运行

/*带权无向图的邻接矩阵存储方式*/ 
#include<iostream>
#include<malloc.h>
#define InfoType int 
using namespace std;
const int maxsize=50;
typedef struct 
{  
	int data; //vertex data,顶点编号
	InfoType info;		//顶点其他信息
}VertexType;
//图的定义
typedef struct  		
{
	int n;//顶点数
	int e;//边数 
	int edges[maxsize][maxsize];//邻接矩阵
	VertexType vexs[maxsize];//存放顶点信息
}MatGraph;

//找出v所在vexs数组的下标 
int locatevex(MatGraph *G,char v)
{
	int k;
	for (k=0;k<G->n;k++)
    	if (G->vexs[k].data==v)
			return k;
}

void CreateMatGraph(MatGraph *&G)
{ 
	int i,j,k,w;  
	char v1,v2;
	cout<<"输入图的顶点个数和边的个数:"<<endl; 
	cin>>G->n>>G->e;
    cout<<"输入各个顶点的信息:"<<endl; 
    for(k=0;k<G->n;k++)
    {
		cin>>G->vexs[k].data;
	}
//初始化设置邻接矩阵的对角线的值为0,其余部分为无穷大 
    for(i=0;i<G->n;i++)
    
        for(j=0;j<G->n;j++)
        {
            if(i==j)
				G->edges[i][j]=0;
            else
				G->edges[i][j]=32767;
		}
//找到两顶点的位置,并再矩阵的相应位置赋权值 
cout<<"输入两顶点名称和两顶点之间边的权值:"<<endl; 
    for(k=0;k<G->e;k++)
	{
		cin>>v1>>v2>>w; //顶点名称和权值
       	i=locatevex(G,v1); 
		j=locatevex(G,v2); //找顶点序号
      	G->edges[i][j]=w;         
		G->edges[j][i]=w;
	}
}
void  Prim(MatGraph *g,int v)
{
	int lowcost[maxsize];
	int min;
	int closest[maxsize],i,j,k,n;
	for(i=0;i<g->n;i++)//给lowcost[]和closest[]置初值
	{
		lowcost[i]=g->edges[v][i];
		closest[i]=v;
	}
	for(i=1;i<g->n;i++)//输出(n-1)条边
	{
		min=32767;
    	for(j=0;j<g->n;j++)//在(V-U)中找出离U最近的顶点k
    	{
			if(lowcost[j]!=0 && lowcost[j]<min)
			{
				min=lowcost[j];
				k=j;//k记录最近顶点编号
			}
		}
		cout<<"相邻的两点: "<<closest[k]<<" "<<k<<endl;
		cout<<"两点之间边的权值为: "<<min<<endl;
   		lowcost[k]=0;//标记k已经加入U
		cout<<1<<endl;
		for(j=0;j<g->n;j++)//修改数组lowcost和closest
		{
			if(lowcost[j]!=0 && g->edges[k][j]<lowcost[j])
   			{
				lowcost[j]=g->edges[k][j];
				closest[j]=k;
    		}
    	}
   }
}
int main()
{
	MatGraph *G;//定义邻接矩阵指针G 
	G=(MatGraph *)malloc(sizeof(MatGraph));//为指针G分配存储空间 
	CreateMatGraph(G);
	int v;
	cout<<"输入起始顶点编号:"<<endl;
	cin>>v; 
	Prim(G,v);
	return 0;
 } 

主要问题出现在普里姆算法的中的for循环之中,无法输出相邻的点和两点边的权值

参考输入值

输入图的顶点个数和边的个数:
7 9
输入各个顶点的信息:
0 1 2 3 4 5 6
输入两顶点名称和两顶点之间边的权值:
0 1 28
0 5 10
5 4 25
4 6 24
6 1 14
6 3 18
4 3 22
3 2 12
1 2 16
输入起始顶点编号:
0
  • 写回答

1条回答 默认 最新

  • 浴乎风乎 2023-04-10 22:03
    关注

    一、

    int locatevex(MatGraph *G,char v)
    {
        int k;
        for (k=0;k<G->n;k++)
            if (G->vexs[k].data==v)
                return k;
    }
    

    这里的v是char型的。
    二、

    typedef struct 
    {  
        int data; //vertex data,顶点编号
        InfoType info;        //顶点其他信息
    }VertexType;
    

    这里的data是int型的

    进行了int==char的操作 实测把int data 换成char data可以运行且样例正确跑过。

    因为char值为‘0’的int值为48 并不会等于int 0。

    评论 编辑记录

报告相同问题?

悬赏问题

  • ¥15 chaquopy python 安卓
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 CSS实现渐隐虚线框
  • ¥15 有没有帮写代码做实验仿真的
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥30 vmware exsi重置后登不上
  • ¥15 易盾点选的cb参数怎么解啊
  • ¥15 MATLAB运行显示错误,如何解决?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容