回 帖 发 新 帖 刷新版面

主题:我有个最小生成树程序总是不对 呀,

#include<iostream.h>
#include<stdlib.h>
#define maxsize 10000
#include<iomanip.h>
typedef struct
{
int adjvex;
long lowcost;
}*closearc,close;
typedef struct
{
int weight;
int vexnum,arcnum;
int data;
int *vertex;
long **arcs;
}graph;
int locate(graph &g,int v1)
{
     int i;
     for(i=0;i<g.vexnum;i++)
         if(v1==g.vertex[i])
             return i;
    return -1;
}
void creat(graph &g)
{
   int i=0,j=0,k=0;
   cout<<"输入顶点个数和边数:"<<endl;
   cin>>g.vexnum>>g.arcnum;
   if(!(g.vertex=(int *)malloc(g.vexnum*sizeof(int))))
       return ;
   if(!(g.arcs=(long **)malloc(g.vexnum*sizeof(long *))))
       return;
   for(i=0;i<g.vexnum;i++)
   {
        if(!(g.arcs[i]=(long *)malloc(g.vexnum*sizeof(long))))
          return ;
       cout<<"输出顶点的值="<<endl;
       cin>>g.vertex[i];
   }
   for(i=0;i<g.vexnum;i++)
       for(j=0;j<g.vexnum;j++)
          g.arcs[i][j]=maxsize;
   for(k=0;k<g.arcnum;k++)
   {
       int v1,v2,w;
       cout<<"输入v1和v2和w"<<endl;
       cin>>v1>>v2>>w;
       i=locate(g,v1);
       j=locate(g,v2);
       g.arcs[i][j]=w;
       g.arcs[j][i]=g.arcs[i][j];
   }
}
int min(closearc &c,graph &g)
{
int j=0,i=0,min=10100;
for(i=0;i<g.vexnum;i++)
{
   if(min>c[i].lowcost&&c[i].lowcost!=0)
   {
       min=c[i].lowcost;
       j=i;
   }
  }
return j;
}
void minspantree(graph &g,closearc &c,int u)
{
   int i=0,k=0;int m=0;
cout<<"m="<<m<<endl;    
   if(!(c=(closearc)malloc(sizeof(close)*g.vexnum)));
       return;
    k=locate(g,u);
    for(i=0;i<g.vexnum;i++)
    {
       if(i!=k)
       {
          c[i].lowcost=g.arcs[k][i];
          if(g.arcs[k][i]!=10000)          
               c[i].adjvex=k;          
          else
              c[i].adjvex=-1;
       }
    }
    c[k].adjvex=-1;
    c[k].lowcost=0;
    for(i=1;i<g.vexnum;i++)
    {        
        m=min(c,g);
        
        cout<<"c["<<m<<"].adjvex="<<c[m].adjvex<<endl<<g.vertex[m]<<endl;
        cout<<"c["<<m<<"].lowcost="<<c[m].lowcost<<endl;
        c[m].lowcost=0;
        for(int j=0;j<g.vexnum;j++)
            if(g.arcs[m][j]<c[j].lowcost&&c[j].lowcost!=0)
            {
                c[j].lowcost=g.arcs[m][j];
                c[j].adjvex=j;
            }
    }
}
void print(graph &g)
{
    int i,j;
    cout<<"顶点:"<<endl;
    for(i=0;i<g.vexnum;i++)
        cout<<g.vertex[i]<<setw(5);
    cout<<endl;
    cout<<"图的邻接矩阵为:"<<endl;
    for(i=0;i<g.vexnum;i++)
    {
        for(j=0;j<g.vexnum;j++)
            cout<<setw(5)<<g.arcs[i][j]<<' ';
        cout<<endl;
    }
}
void Destroy(graph &g)
{

    int v;
    for(v=0;v<g.vexnum;v++)
    {
       delete [] g.arcs[v];
    }
    delete []g.arcs;
}
void main()
{   
    closearc c;
    graph g;
    creat(g);
    print(g);
    cout<<"输出最小生成树"<<endl;
       minspantree(g,c,g.vertex[0]);
    Destroy(g);
}
有答案,但是生成树的答案就不对,前面的图的创建没有问题,就是求生成树出了问题

回复列表 (共3个回复)

沙发

顶一下

板凳

大体上看是没有问题的。但是程序太长,且没有注释,很难深入到每一处的细节中。

3 楼

cuo le  a

我来回复

您尚未登录,请登录后再回复。点此登录或注册