#include<stdio.h>
#include<string.h>
#define Max 20
int visited[20];
typedef struct
{
char vex[Max];
int vexs[Max][Max];
int vexnum,arcnum;
}MGraph;
typedef struct {
char adjvex;
int lowcost;
}closest;
int Loca(MGraph &G,char ch)
{
int i;
for(i=0;i<G.vexnum;i++)
{
if(ch==G.vex[i])
return i;
}
return -1;
}
void Creat_vex(MGraph &G)
{
int i,j;
int la1,la2;
char ch1,ch2;
int len;
printf("请输入图的点数以及边数:\n");
scanf("%d%d",&G.vexnum,&G.arcnum);
printf("请输入图的点的信息:\n");
for(i=0;i<G.vexnum;i++)
{
getchar();
scanf("%c",&G.vex[i]);
}
for(i=0;i<G.vexnum;i++)
for(j=0;j<G.vexnum;j++)
G.vexs[i][j]=10000;
printf("请输入个点之间的关系:\n");
for(i=0;i<G.arcnum;i++)
{
getchar();
scanf("%c %c %d",&ch1,&ch2,&len);
la1=Loca(G,ch1);
la2=Loca(G,ch2);
G.vexs[la1][la2]=len;
G.vexs[la2][la1]=G.vexs[la1][la2];
}
}
void prim(MGraph G,char start)
{
int i,j,k;
int ls;
int min;
int sum=0;
ls=Loca(G,start);
closest C[Max];
for(i=0;i<G.vexnum;i++)
{
if (i!=ls)
{
C[i].adjvex=start;
C[i].lowcost=G.vexs[ls][i];
}
}
C[ls].lowcost=0;
for(i=1;i<G.vexnum;i++)
{
min=10000;
for(j=0;j<G.vexnum;j++)
{
if(C[j].lowcost && C[j].lowcost<min)
{
k=j;
min=C[j].lowcost;
}
}
printf("到点%c 度为%d ",C[k].adjvex,k);
sum+=C[k].lowcost;
C[k].lowcost=0;
for(j=0;j<G.arcnum;j++)
{
if(G.vexs[k][j]<C[j].lowcost)
{
C[j].lowcost=G.vexs[k][j];
C[j].adjvex=G.vex[k];
}
}
}
putchar('\n');
printf("最小生成树的度的总和:%d\n",sum);
}
void BFS_Travel(MGraph G)
{
queue<char>Q;
int i,j,k;
char ch;
for(i=0;i<G.vexnum;i++)
{
if(!visited[i])
{
visited[i]=1;
printf("%c ",G.vex[i]);
Q.push(G.vex[i]);
while(!Q.empty())
{
ch=Q.front();
Q.pop();
k=Loca(G,ch);
for(j=0;j<G.vexnum;j++)
{
if(!visited[j]&&G.vexs[k][j])
{
visited[j]=1;
printf("%c ",G.vex[j]);
Q.push(G.vex[j]);
}
}
}
}
}
}
int main()
{
MGraph G;
char start;
Creat_vex(G);
BFS_Travel(G);
putchar('\n');
printf("请输入起始点:");
getchar();
scanf("%c",&start);
prim(G,start);
return 0;
}
最小生成树prim(普里姆)算法
最新推荐文章于 2020-08-13 12:26:58 发布