prim

#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;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值