散100分求普里姆算法和克鲁斯卡尔算法的C语言实现代码!!急!!!!!

iter_zc 2004-12-29 06:32:44
高手请帮小弟一把,急求普里姆算法和克鲁斯卡尔算法的C语言实现代码!!!万分感谢!!!!
...全文
512 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
iter_zc 2004-12-30
  • 打赏
  • 举报
回复
万分感谢啊!!!!
dzy1982 2004-12-30
  • 打赏
  • 举报
回复
找本数据结构的书,里面有
bill_li 2004-12-29
  • 打赏
  • 举报
回复
真的,好强呀
吴大猫 2004-12-29
  • 打赏
  • 举报
回复
图的存储结构定义
#define MGRAPH_H
#define INFINITY 100
#define MAX_VERTEX_NUM 20

typedef int VRType;
typedef char InfoType;
typedef char VertexType;
typedef enum { DG,DN,UDG,UDN } GraphKind;
typedef struct {
VRType adj;
InfoType *info;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct {
VertexType vexs[MAX_VERTEX_NUM];
AdjMatrix arcs;
int vexnum,arcnum;
GraphKind kind;
}MGraph;

边集数组类型定义
typedef struct {
int fromvex;
int endvex;
int weight;
}edge;
typedef struct {
edge *set;
int arc_num;
int vex_num;
}edgeset;

typedef struct listnode{
int adjvex;
int weight;
struct listnode *next;
}listnode;
typedef listnode* adjlist[MAX_VERTEX_NUM];

//该算法中的图用邻接矩阵存储,CT为存储着最小生成树的边集数组
void Prim(MGraph g,edgeset *CT,int sta_vex) //sta_vex是初始点
{
int i,j,k,min,m,p,w;
int tm_frvex,tm_envex,tm_weight;
int t = 0;

//给CT赋初值
for(i=0; i<CT->vex_num; i++)
if(g.arcs[sta_vex][i].adj!=0) {
CT->set[t].fromvex = sta_vex;
CT->set[t].endvex = i;
CT->set[t].weight = g.arcs[sta_vex][i].adj;
t++;
}

//进行n-1次循环,每次求出最小生成树的第k条边
for(k=1; k<=g.vexnum-1; k++) {
min = INFINITY;
m = k - 1;
//从CT[k-1]到CT[n-2]中查找最短边
for(i=k-1;i<g.vexnum-1;i++)
if(min>CT->set[i].weight) {
min = CT->set[i].weight;
m = i;
}
//把最短边调到第k-1下标位置
tm_frvex = CT->set[k-1].fromvex;
tm_envex = CT->set[k-1].endvex;
tm_weight = CT->set[k-1].weight;
CT->set[k-1].fromvex = CT->set[m].fromvex;
CT->set[k-1].endvex = CT->set[m].endvex;
CT->set[k-1].weight = CT->set[m].weight;
CT->set[m].fromvex = tm_frvex;
CT->set[m].endvex = tm_envex;
CT->set[m].weight = tm_weight;
//把新并入最小生成树的顶点序号副给p
p = CT->set[k-1].endvex;
//修改CT有关边,使CT中到CT外的每一顶点各保持一条目前为止最短的边
for(i=k; i<g.vexnum-1; i++) {
j = CT->set[i].endvex;
w = g.arcs[p][j].adj;
if(w<CT->set[i].weight && p!=j) {
CT->set[i].weight = w;
CT->set[i].fromvex = p;
}
}
}
}

//ET1是已排好序的边集数组,ET2返回最小生成树,G是图的邻接矩阵表示
void Kruskal(edgeset ET1,edgeset *ET2,MGraph G)
{
int i,j,k,m1,m2,flag,tag; //m1,m2 分别用来表示ET1[i]中两个顶点所在集合的序号
adjlist alist; //邻接表alist作为集合使用,其中每一个单链表alist[i]用来
//表示一个集合,若一个顶点属于这个集合,则对应该单链表中的
//一个结点,该结点的adjvex域的值为该顶点序号
listnode *p,*q;

for(i=0; i<G.vexnum;i++) {
p = (listnode*)malloc(sizeof(listnode));
p->adjvex = i;
p->next = NULL;
alist[i] = p;
}

i = 0,k = 1; //k表是待取的最小生成树的边数,初值为1,i表示ET1中待扫描边的下标位置
//进行n-1次循环,得到生成树n-1条边
while(k<G.vexnum) {
m1 = ET1.set[i].fromvex;
m2 = ET1.set[i].endvex;
flag = 1;
tag = 0;
for(j=0; j<G.vexnum&&flag; j++) { //求边ET[j]中的两个顶点所在集合的序号m1,m2
p = alist[j];
while(p&&flag) {
if(p->adjvex == m1) {
m1 = j;
tag++;
}
if(p->adjvex == m2) {
m2 = j;
tag++;
}
if(tag == 2) flag = 0;
p = p->next;
}
}
//若两个集合序号不等,则表明ET[i]是生成树的一条边,应把他加入到边集数组ET2中
if(m1 != m2) {
//合并两个集合,并将另一个置为空
p = alist[m1];
while(p->next) p = p->next;
p->next = alist[m2];
alist[m2] = NULL;
ET2->set[k-1].fromvex = ET1.set[i].fromvex;
ET2->set[k-1].endvex = ET1.set[i].endvex;
ET2->set[k-1].weight = ET1.set[i].weight;
k++;
}
i++;
}
for(i=0; i<G.vexnum; i++) {
p = alist[i];
while(p) {
q = p;
p = p->next;
free(q);
}
}
ET2->arc_num = G.vexnum - 1;
ET2->vex_num = G.vexnum;
}
truewill 2004-12-29
  • 打赏
  • 举报
回复
-_-
听都没听过,人命不如写英文吧

15,447

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧