最短路径与最小生成树.docx
- 文档编号:28107308
- 上传时间:2023-07-08
- 格式:DOCX
- 页数:13
- 大小:84.91KB
最短路径与最小生成树.docx
《最短路径与最小生成树.docx》由会员分享,可在线阅读,更多相关《最短路径与最小生成树.docx(13页珍藏版)》请在冰豆网上搜索。
最短路径与最小生成树
数据结构
实验报告
姓名:
邱金梁
班级:
rJBJava101
学号:
201007092137
指导老师:
杨关
时间:
2012年6月13日
一、最小生成树
#include
usingnamespacestd;
#defineMAX_VERTEX_NUM20//最大结点数
#defineMAX200
typedefstructClose//结构体
{
charadjvex;
intlowcost;
}Close,close[MAX_VERTEX_NUM];
typedefstructArcNode
{
intadjvex;
ArcNode*nextarc;
intinfo;
}ArcNode;
typedefstructVNode
{
chardata;
ArcNode*firstarc;
}VNode,AdjList[MAX_VERTEX_NUM];
typedefstruct
{
AdjListverties;
intvexnum,arcnum;
}ALGraph;
ALGraphG;//对象G
intLocateVek(ALGraph,char);//返回结点位置
intminimum(close);//返回最小数
voidMinSpanTree_PRIM(ALGraph,char);//最小生成树
voidCreate(ALGraph&);//创建邻接表
intmain()
{
chara;inti=1;
Create(G);
/*for(inti=1;i<=G.vexnum;i++)
{
for(s=G.verties[i].firstarc;s!
=NULL;s=s->nextarc)
cout< }*/ while(i) { cout<<"输入起点: "; cin>>a; MinSpanTree_PRIM(G,a); cout<<"如果结束输入'0',否则输入'1': "; cin>>i; } return0; } intLocateVek(ALGraphG,charu) { inti; for(i=1;i<=G.vexnum;i++) if(u==G.verties[i].data) returni; return-1; } intminimum(closem)//返回最小数 { inti=0,j,n=200; for(i=1;i<=G.vexnum;i++) if(m[i].lowcost =0) { n=m[i].lowcost; j=i; } returnj; } voidMinSpanTree_PRIM(ALGraphG,charu) { intj,k,a; closeclosedge;ArcNode*s,*p,*q; for(j=1;j<=MAX_VERTEX_NUM;j++) closedge[j].lowcost=MAX;//把所有值都赋为最大 k=LocateVek(G,u); for(j=1;j<=G.vexnum;j++) if(j! =k) { closedge[j].adjvex=u; for(s=G.verties[k].firstarc;s! =NULL;s=s->nextarc) if(j==s->adjvex) {closedge[j].lowcost=s->info; break; } } closedge[k].lowcost=0; cout<<"最小生成树: "<<"{";//查找并输出最小生成树 for(j=1;j { k=minimum(closedge); cout<<"("< < closedge[k].lowcost=0; for(inti=1;i<=G.vexnum;i++) { for(p=G.verties[k].firstarc;p! =NULL;p=p->nextarc) if(p->info { closedge[i].adjvex=G.verties[k].data; closedge[i].lowcost=p->info; } } }cout<<"}"< cout<<"边及对应权值: "< for(j=G.vexnum;j>=1;j--) { if(closedge[j].lowcost==0&&G.verties[j].data! =u) {cout<<"("< <<","< <<")=="; a=closedge[j].adjvex; for(q=G.verties[j].firstarc;q! =NULL;q=q->nextarc) if(a-64==q->adjvex) cout< } } } voidCreate(ALGraph&G) { inti,j,k,x; chara,b;ArcNode*s; cout<<"输入顶点数(1-20): "; cin>>G.vexnum; cout<<"输入边数: "; cin>>G.arcnum; cout<<"输入顶点信息: "< for(i=1;i<=G.vexnum;i++) { cin>>G.verties[i].data; G.verties[i].firstarc=NULL; } for(i=1;i<=G.arcnum;i++) { cout<<"输入相邻两结点和权值"; cin>>a>>b;cin>>x; j=a-64;k=b-64;//将字符型转化成整数型 s=newArcNode; s->info=x; s->adjvex=k; s->nextarc=G.verties[j].firstarc; G.verties[j].firstarc=s; s=newArcNode; s->info=x; s->adjvex=j; s->nextarc=G.verties[k].firstarc; G.verties[k].firstarc=s; } } 二、最短路径 #include #include #include #include usingnamespacestd; enumMark{UNVISITED,VISITED}; typedefstructDocuNode { intn; Markm; }DocuNode; typedefstructDocu { intn; DocuNode*Node; int**edge; }Docu; MarkgetMark(Docu*D,inti) { returnD->Node[i].m; } voidsetMark(Docu*D,intv,Markm) { D->Node[v].m=m; } intfirst(Docu*D,intv) { inti; for(i=0;i if((D->edge[v][i])! =-1) returni; returni; } intnext(Docu*D,intv,intw) { inti; for(i=w+1;i if((D->edge[v][i])! =-1) returni; returni; } intweight(Docu*D,intv,intw) { returnD->edge[v][w]; } intminVertex(Docu*D,int*B) { inti,v; for(i=0;i if(getMark(D,i)==UNVISITED) { v=i; break; } for(i++;i if(getMark(D,i)==UNVISITED&&((((B[i] =-1)||(B[v]==-1)))) v=i; returnv; } voidDijkstra(Docu*D,int*B,ints) { inti,v,w; for(i=0;i { v=minVertex(D,B); if(B[v]==-1)return; setMark(D,v,VISITED); for(w=first(D,v);w if((B[w]>(B[v]+weight(D,v,w)))||(B[w]==-1)) B[w]=B[v]+weight(D,v,w); } } intmain() { Docu*D; ifstreamfin("Docu.txt"); inti,j; D=(Docu*)malloc(sizeof(Docu)); fin>>D->n;//从文件中读取节点数 D->Node=(DocuNode*)malloc(sizeof(DocuNode)); for(i=0;i D->Node[i].m=UNVISITED;//将所有节点设为未被访问的 D->edge=(int**)calloc(1,sizeof(int*)*D->n); if(! D->edge)//若内存未分配成功 cout<<"error"; for(i=0;i { D->edge[i]=(int*)calloc(1,sizeof(int)*D->n); if(! D->edge[i])//若内存未分配成功 cout<<"error"; } for(i=0;i for(j=0;j fin>>D->edge[i][j];//从文件中读取边权值 intstart,end; cout<<"起点: "< cin>>start; cout<<"终点: "< cin>>end; int*B; B=(int*)malloc(D->n*sizeof(int)); for(i=0;i B[i]=D->edge[start][i]; Dijkstra(D,B,start); cout< getch(); return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 路径 最小 生成