主题:我有个最小生成树程序总是不对 呀,
#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);
}
有答案,但是生成树的答案就不对,前面的图的创建没有问题,就是求生成树出了问题
#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);
}
有答案,但是生成树的答案就不对,前面的图的创建没有问题,就是求生成树出了问题