//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
链接城市最小生成树
最新推荐文章于 2022-05-11 08:13:57 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)