#include <stdio.h>
#include <stdlib.h>
#define MAX_VERT_NUM 40
#define INTMAX 32767
typedef struct ArcNode{
int adjvex;
int cost;
struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode
{
ArcNode *firstarc; /*指向第一条依附该顶点的弧的指针*/
}VNode;
typedef struct
{
VNode vertices[MAX_VERT_NUM]; /*邻接表*/
int vexs[MAX_VERT_NUM][MAX_VERT_NUM]; /*邻接矩阵*/
int vexnum;/*顶点个数*/
int arcnum; /*边的个数*/
}GRAPH;
int visited[MAX_VERT_NUM];
void DFS(GRAPH *g,int v);
void DFSTraverse(GRAPH *g,int v);
void BFSTraverse(GRAPH *g,int v);
void BFS(GRAPH *g,int v);
void createUDV(GRAPH *g) /*此算法为创建无向网*/
{
int i,j,n,e,c;
ArcNode *p;
scanf("%d%d",&n,&e);/*输入顶点数和边数*/
g->vexnum=n;
g->arcnum=e;
for(i=0;i<n;i++)
{
g->vertices .firstarc=NULL;
for(j=0;j<n;j++)
{
g->vexs[j]=INTMAX;
}
}
while(e--)
{
scanf("%d%d%d",&i,&j,&c);
g->vexs[j]=c; /*邻接矩阵*/
g->vexs[j]=c;
p=(ArcNode *)malloc(sizeof(ArcNode)); /*邻接表*/
p->nextarc=g->vertices.firstarc;
p->adjvex=j;
p->cost=c;
g->vertices.firstarc=p;
p=(ArcNode *)malloc(sizeof(ArcNode));
p->nextarc=g->vertices[j].firstarc;
p->adjvex=i;
p->cost=c;
g->vertices[j].firstarc=p;
}
//printf("%d %d ok/n",g->vexnum,g->arcnum);
}
void prim(GRAPH *g,int v)
{
struct
{
int adjvex;
int mincost;
}closedge[MAX_VERT_NUM];
int i,j,u,t;
ArcNode *p;
for(i=0;i<g->vexnum;i++)
closedge.mincost=INTMAX;
closedge[v].mincost=0;
printf("%d %d/n",g->vexnum,g->arcnum);
p=g->vertices[v].firstarc;
while(p)
{
u=p->adjvex;
closedge.mincost=p->cost;
p=p->nextarc;
}
printf("%d ",v);
for(i=0;i<g->vexnum-1;i++)
{
t=INTMAX;
u=0;
for(j=0;j<g->vexnum;j++)
{
if(closedge[j].mincost>0 && closedge[j].mincost<t)
{
t=closedge[j].mincost;
u=j;
}
}
closedge.mincost=0;
printf("%d ",u);
/*调整closedge数组*/
p=g->vertices.firstarc;
while(p)
{
if(closedge[p->adjvex].mincost>0 && p->cost<closedge[p->adjvex].mincost)
{
closedge[p->adjvex].mincost=p->cost;
}
p=p->nextarc;
}
}
}
int main()
{
GRAPH g;
int v=0;
createUDV(&g);
prim(&g,0);
return 0;
}
#include <stdlib.h>
#define MAX_VERT_NUM 40
#define INTMAX 32767
typedef struct ArcNode{
int adjvex;
int cost;
struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode
{
ArcNode *firstarc; /*指向第一条依附该顶点的弧的指针*/
}VNode;
typedef struct
{
VNode vertices[MAX_VERT_NUM]; /*邻接表*/
int vexs[MAX_VERT_NUM][MAX_VERT_NUM]; /*邻接矩阵*/
int vexnum;/*顶点个数*/
int arcnum; /*边的个数*/
}GRAPH;
int visited[MAX_VERT_NUM];
void DFS(GRAPH *g,int v);
void DFSTraverse(GRAPH *g,int v);
void BFSTraverse(GRAPH *g,int v);
void BFS(GRAPH *g,int v);
void createUDV(GRAPH *g) /*此算法为创建无向网*/
{
int i,j,n,e,c;
ArcNode *p;
scanf("%d%d",&n,&e);/*输入顶点数和边数*/
g->vexnum=n;
g->arcnum=e;
for(i=0;i<n;i++)
{
g->vertices .firstarc=NULL;
for(j=0;j<n;j++)
{
g->vexs[j]=INTMAX;
}
}
while(e--)
{
scanf("%d%d%d",&i,&j,&c);
g->vexs[j]=c; /*邻接矩阵*/
g->vexs[j]=c;
p=(ArcNode *)malloc(sizeof(ArcNode)); /*邻接表*/
p->nextarc=g->vertices.firstarc;
p->adjvex=j;
p->cost=c;
g->vertices.firstarc=p;
p=(ArcNode *)malloc(sizeof(ArcNode));
p->nextarc=g->vertices[j].firstarc;
p->adjvex=i;
p->cost=c;
g->vertices[j].firstarc=p;
}
//printf("%d %d ok/n",g->vexnum,g->arcnum);
}
void prim(GRAPH *g,int v)
{
struct
{
int adjvex;
int mincost;
}closedge[MAX_VERT_NUM];
int i,j,u,t;
ArcNode *p;
for(i=0;i<g->vexnum;i++)
closedge.mincost=INTMAX;
closedge[v].mincost=0;
printf("%d %d/n",g->vexnum,g->arcnum);
p=g->vertices[v].firstarc;
while(p)
{
u=p->adjvex;
closedge.mincost=p->cost;
p=p->nextarc;
}
printf("%d ",v);
for(i=0;i<g->vexnum-1;i++)
{
t=INTMAX;
u=0;
for(j=0;j<g->vexnum;j++)
{
if(closedge[j].mincost>0 && closedge[j].mincost<t)
{
t=closedge[j].mincost;
u=j;
}
}
closedge.mincost=0;
printf("%d ",u);
/*调整closedge数组*/
p=g->vertices.firstarc;
while(p)
{
if(closedge[p->adjvex].mincost>0 && p->cost<closedge[p->adjvex].mincost)
{
closedge[p->adjvex].mincost=p->cost;
}
p=p->nextarc;
}
}
}
int main()
{
GRAPH g;
int v=0;
createUDV(&g);
prim(&g,0);
return 0;
}