首页 最小生成树问题源代码

最小生成树问题源代码

举报
开通vip

最小生成树问题源代码最小生成树问题源代码 #include #include using namespace std; #define int_max 10000 #define inf 9999 #define max 20 #define MAX 20 #define M 20 typedef struct ArcCell { int adj; char *info; }ArcCell,AdjMatrix[20][20]; typedef struct { char vexs[20]; Adj...

最小生成树问题源代码
最小生成树问题源代码 #include #include using namespace std; #define int_max 10000 #define inf 9999 #define max 20 #define MAX 20 #define M 20 typedef struct ArcCell { int adj; char *info; }ArcCell,AdjMatrix[20][20]; typedef struct { char vexs[20]; AdjMatrix arcs; int vexnum,arcnum; }MGraph; int localvex(MGraph G,char v) { int i=0; while(G.vexs[i]!=v) {++i;} return i; } void ljjzprint(MGraph G) { int i,j,n=0; printf("建立的邻接矩阵如下:\n"); printf("\n"); printf(" _____________________________________________\n"); for(i=0;i!=G.vexnum;i++) { for(j=0;j!=G.vexnum;j++) { if(j==0)printf(" "); printf("%d",G.arcs[i][j].adj);printf(" ");n++; if(n==G.vexnum){ printf("\n");n=0;} } } printf(" ______________________________________________\n");} int creatMGraph(MGraph &G) {char v1,v2; int i,j,w; printf("建立邻接矩阵:\n"); printf("请输入图G顶点(城市)和弧(边)的个数:"); scanf("%d",&G.vexnum); scanf("%d",&G.arcnum); printf("输入所有顶点:"); for(i=0;i>G.vexs[i]; } for(i=0;i>v1>>v2>>w; i=localvex(G,v1); j=localvex(G,v2); G.arcs[i][j].adj=w; G.arcs[j][i].adj=w; } ljjzprint(G); printf("图G邻接矩阵创建成功!\n"); return G.vexnum;} int visited[max]; int we; typedef struct arcnode { int adjvex; struct arcnode *nextarc; char *info; }arcnode; typedef struct vnode { char data; arcnode *firstarc; }vnode,adjlist; typedef struct//图的定义 { adjlist vertices[max]; int vexnum, arcnum; int kind; }algraph; int prim(int g[][max],int n) //最小生成树PRIM算法 { int lowcost[max], prevex[max]; int i,j,k,min; int sum=0; for(i=2;i<=n;i++) { lowcost[i]=g[1][i]; prevex[i]=1; } lowcost[1]=0; for(i=2;i<=n;i++) { min=inf; k=0; for(j=2;j<=n;j++) if((lowcost[j]arcnum,&D->vexnum); for(i=1;i<=D->vexnum;i++)//初始化图 { for(j=1;j<=D->vexnum; j++) { D->arc[i][j].adj=D->arc[j][i].adj=0; } } for(i=1;i<=D->arcnum;i++)//输入边和权值 { printf("\n请输入有边的2个顶点"); scanf("%d %d",&n,&m); while(n<0||n>D->vexnum||m<0||n>D->vexnum) { printf("输入的数字不符合要求 请重新输入:"); scanf("%d%d",&n,&m); } D->arc[n][m].adj=D->arc[m][n].adj=1; getchar(); printf("\n请输入%d与%d之间的权值:",n,m); scanf("%d",&D->arc[n][m].weight); } printf("邻接矩阵为:\n"); for(i=1;i<=D->vexnum;i++) { for(j=1;j<=D->vexnum;j++) { printf("%d ",D->arc[i][j].adj); } printf("\n"); } } void sort(edge edges[],MGraphA *D)//对权值进行排序 { int i, j; for(i=1;iarcnum;i++) { for(j=i+1;j<=D->arcnum;j++) { if(edges[i].weight>edges[j].weight) { Swapn(edges, i, j); } } } printf("权排序之后的为:\n"); for(i=1;iarcnum;i++) { printf("<< %d, %d >> %d\n", edges[i].begin, edges[i].end, edges[i].weight); } } void Swapn(edge *edges,int i, int j)//交换权值 以及头和尾 { int temp; temp=edges[i].begin; edges[i].begin=edges[j].begin; edges[j].begin=temp; temp=edges[i].end; edges[i].end=edges[j].end; edges[j].end=temp; temp=edges[i].weight; edges[i].weight=edges[j].weight; edges[j].weight=temp; } void MiniSpanTree(MGraphA *D)//生成最小生成树 { int i,j,n,m,SUM=0; int k=1; int parent[M]; edge edges[M]; for(i=1;ivexnum;i++) { for(j=i+1;j<=D->vexnum;j++) { if(D->arc[i][j].adj==1) { edges[k].begin=i; edges[k].end=j; edges[k].weight=D->arc[i][j].weight; k++; } } } sort(edges, D); for(i=1;i<=D->arcnum; i++) { parent[i]=0; } printf("最小生成树为:\n"); for(i=1;i<=D->arcnum; i++)//核心部分 { n=Find(parent, edges[i].begin); m=Find(parent, edges[i].end); if(n!=m) { parent[n]=m; printf("<< %d, %d >> %d\n", edges[i].begin, edges[i].end, edges[i].weight); SUM=SUM+edges[i].weight; } } cout<<"最少生成树的代价:"; cout<0) { f=parent[f]; } return f; } void main() { algraph gra; MGraph G; MGraphA *D; int i,d,m,g[20][20]; char a='a'; int s; char y='y'; while(y='y') { printf(" …………最小生成树的求法…………\n"); printf(" ____________________________________________\n"); printf(" | 1.建立邻接矩阵(无向图) |\n"); printf(" | 2.用prim算法求最小生成树(无向图) |\n"); printf(" | 3.用kruskal算法求最小生成树 |\n"); printf(" |___________________________________________ |\n"); printf(" 请选择相应的菜单(1-3) :"); cin>>s; switch(s) { case 1: d=creatMGraph(G); vnode v; cout<>y; if(y=='n') break; } }
本文档为【最小生成树问题源代码】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_447713
暂无简介~
格式:doc
大小:29KB
软件:Word
页数:12
分类:
上传时间:2017-09-30
浏览量:89