链接城市最小生成树

该博客介绍了一种使用C语言实现城市最小生成树的算法,包括Prim和Kruskal两种方法。博客首先定义了图的数据结构,然后通过读取文件中的边信息来创建图。接着,详细展示了Prim算法和Kruskal算法的实现过程,并提供了相应的输出功能,以图形形式展示最小生成树。最后,给出了一个简单的主程序,让用户可以选择加载城市数据、显示城市布局或构造最小生成树。
摘要由CSDN通过智能技术生成
//Graphziv画图软件

//文件

#include<stdio.h>

#include<string.h>
#include<stdlib.h>
#define FINITY 20000 // FINITY 表示无穷大
#define M 100 //顶点数
typedef  int edgetype; //边的权值类型


typedef  char vertextype; //顶点值类型


typedef struct {
vertextype  vexs[M];//顶点信息域
edgetype    edges[M][M];//邻接矩阵
int n,e; //图的顶点总数与边数
}mgraph;


typedef struct edgedata
{
int beg,en;
int length;
}edge;
edge tree[100];
typedef struct G
{
    char begin;
    char end;
    int quanzhi;
    int num;
}Tree;
typedef struct W
{
    int begin;
    int end;
    int quanzhi;
    int num;
}Tree1;


   Tree1 tree1[50];//zhu
   Tree tree2[100];//prim
   Tree tree3[50];


void creat (mgraph *g,char *s,int c);


void prim(mgraph g,edge tree[M-1]);






void creat (mgraph *g,char *s,int c) // C=0 表示建立无向图
{
int i,j,k,w;
FILE *rf;
rf = fopen(s,"r");//从文件中读取图的边信息
if(rf)
{
fscanf(rf,"%d%d",&g->n,&g->e);//读入图的顶点数和边数
printf("%d\t%d\n",g->n,g->e);
for(i=0;i < g->n;i++)//读入图的顶点值
fscanf(rf,"%1s",&g->vexs[i]);
for(i=0;i < g->n;i++)//初始化邻接矩阵
for(j=0;j < g->n;j++)
if(i==j)
g->edges[i][j]=0;
else
g->edges[i][j]=FINITY;
        int n2=0;
for(k=0;k < g->e;k++)//读入网络中的边
{
fscanf(rf,"%d%d%d",&i,&j,&w);
tree1[k].begin=i;
tree1[k].end=j;
tree1[k].quanzhi=w;
g->edges[i][j]=w;
if(c==0){
//建立无向图邻接矩阵




   g->edges[j][i]=w;
}
n2++;


}
tree1[1].num=n2;
//printf("")
// int i;
//printf("%d",tree1[1].num);


//for(i=0;i<tree1[1].num;i++)
  //  {
   //     printf("%c",tree1[i].begin);
    //    printf("%c",tree1[i].end);
       // fprintf(fp,"%c%s%c%s",x,str,y,tem);
   // }
fclose(rf); //关闭文件
}
else
g->n=0;
}










void prim(mgraph g,edge tree[M-1])
{
edge x;
int d,min,j,k,s,v;
for(v=1;v<=g.n-1;v++)//建立初始入选点,并初始化生成树边集tree
{
tree[v-1].beg=0;//此处从顶点V0开始求最小生成树
tree[v-1].en=v;
tree[v-1].length=g.edges[0][v];
}
for(k=0;k<=g.n-3;k++)  //依次求当前(第k条边)最小两栖边,并加入tree
{
min=tree[k].length;
s=k;


for(j=k+1;j<=g.n-2;j++)
if(tree[j].length<min)
{
min=tree[j].length;
s=j;
}
v=tree[s].en; //入选顶点为v
x=tree[s]; //通过交换,将当前最小边加入tree中
tree[s]=tree[k];
tree[k]=x;
for(j=k+1;j<=g.n-2;j++)//由于新顶点V的加入,修改两栖边的基本信息
{
d=g.edges[v][tree[j].en];
if(d<tree[j].length)
{
tree[j].length=d;
tree[j].beg=v;
}
}
}
printf("\nthe minimum cost spanning tree is:\n");//输出最小生成树
int n=0;
for(j=0;j<=g.n-2;j++)
{




printf("\n%c---%c %d\n",g.vexs[tree[j].beg],g.vexs[tree[j].en],tree[j].length);
tree2[j].begin=g.vexs[tree[j].beg];
tree2[j].end=g.vexs[tree[j].en];
// strcpy(tree2[j].begin,g.vexs[tree[j].beg]);
        // strcpy(tree2
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值