C++实践Word下载.docx
- 文档编号:17573757
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:30
- 大小:55.58KB
C++实践Word下载.docx
《C++实践Word下载.docx》由会员分享,可在线阅读,更多相关《C++实践Word下载.docx(30页珍藏版)》请在冰豆网上搜索。
voiddelenode(charc);
//删除结点
voidaddedge(charp,charq,floatweight);
//增加含权的边
voiddeledge(charc,charb);
//删除含权的边,该边的权值以MAX表示
voidprintnodenum();
//求图中结点的个数
voidprintedgenum();
//求图中边的个数
voidPpath(intpath[],inti,intv);
//前向递归查找路径上的顶点
voidDispath(floatdist[],intpath[],floats[],intn,intv);
//输出路径(以MAX表示两点重合的情况)
voidDijkstra(intv);
//用Dijkstra算法求单源最短路径
voidbuild();
//建立图的邻接矩阵存储
voidprint();
//输出邻接矩阵
intlocate(charv);
//找顶点V在图中的位置
intfind(intfather[],intv,intnum);
//找下标为v的结点的根父节点
voidkruskal(intfather[]);
//kruskal算法求最小生成树
voidopen();
//从文件中读取数据
voidsave();
//保存数据
intnodenum;
//顶点数
intarcnum;
//边数
char*vex;
//顶点信息(动态)
float**a;
//邻接矩阵(动态)
edgetype*edge;
//边数组(动态)
二.};
小组成员分工
graph:
:
graph()//构造函数
graph(graph&
g)//拷贝构造函数
graph:
~graph()//析构函数
voidgraph:
addnode(charw)//添加结点
voidgraph:
delenode(charc)//删除结点
addedge(charp,charq,floatweight)/增加含权的边
deledge(charc,charb)//删除含权的边,该边的权值以MAX表示
printnodenum()//求图中结点的个数
printedgenum()//求图中边的个数
Ppath(intpath[],inti,intv)//前向递归查找路径上的顶点
Dispath(floatdist[],intpath[],floats[],intn,intv)//输出路径(以MAX表示两点重合的情况)
Dijkstra(intv)//用Dijkstra算法求单源最短路径
build()//建立图的邻接矩阵存储
print()//输出邻接矩阵
intgraph:
locate(charv)//找顶点V在图中的位置
find(int*father,intv,intnum)//找下标为v的结点的根父节点
kruskal(int*father)//kruskal算法求最小生成树
save()//保存数据
open()//从文件中读取数据
voidprintname()//
voidmenu()//菜单
intmain()//main函数,验证(主)程序设计
intmain()
graphg;
inti,*father,v;
floatweight;
charq,a,c;
father=NULL;
printname();
menu();
cin>
>
i;
while(i!
=0)
{
switch(i)
{
case1:
g.build();
break;
case2:
g.print();
case3:
printf("
请输入你要添加的结点:
"
);
cin>
a;
g.addnode(a);
case4:
请输入你要删除的结点:
c;
g.delenode(c);
case5:
请输入要增加的边的两个端点和该边的权值:
\n"
a>
c>
weight;
g.addedge(a,c,weight);
case6:
请输入用两个端点表示你要删除的含权的边:
g.deledge(a,c);
case7:
g.printnodenum();
case8:
g.printedgenum();
case9:
请输入源点:
q;
v=g.locate(q);
g.Dijkstra(v);
case10:
g.kruskal(father);
case11:
g.save();
case12:
g.open();
}
menu();
}
return0;
三.类源程序代码
classgraph;
//提前引用声明
//前向递归查找路径上的顶点
//输出路径(以MAX表示两点重合的情况)
voidbuild();
//找顶点V在图中的位置
//找下标为v的结点的根父节点
//kruskal算法求最小生成树
};
vex=NULL;
a=NULL;
edge=NULL;
arcnum=0;
nodenum=0;
}
{
inti,j;
arcnum=g.arcnum;
nodenum=g.nodenum;
vex=newchar[nodenum];
a=newfloat*[nodenum];
for(i=0;
i<
nodenum;
i++)
a[i]=newfloat[nodenum];
for(j=0;
j<
j++)
a[i][j]=g.a[i][j];
vex[i]=g.vex[i];
edge=newedgetype[arcnum];
arcnum;
edge[i]=g.edge[i];
delete[]vex;
delete[]edge;
deletea;
/*
*MethodName:
无向图中包含结点类的对象
*Discription:
可以在无向图中增加结点
*Parameter:
inti,c,j,k,b;
*floatweight,**a1;
*charp,q,*vex1;
*Return:
None
*Author:
柏雪,田晓霞,华丽娜
*Date:
2011/07/03
*Version:
V0.1
*/
inti,c,j,k,b;
floatweight,**a1;
charp,q,*vex1;
edgetype*edge1;
nodenum++;
vex1=vex;
nodenum-1;
vex[i]=vex1[i];
vex[nodenum-1]=w;
a1=a;
a[i]=newfloat[nodenum];
a[i][j]=a1[i][j];
printf("
请输入你要添加的边的个数:
b;
arcnum=arcnum+b;
edge1=edge;
arcnum-b;
edge[i]=edge1[i];
for(c=0;
c<
c++)
a[c][nodenum-1]=MAX;
a[nodenum-1][c]=MAX;
请输入你要添加的第%d条边的两个端点和该边的权值:
i);
p>
q>
if(vex[c]==p)
j=c;
if(vex[c]==q)
k=c;
a[j][k]=weight;
a[k][j]=weight;
//建立邻接矩阵
edge[arcnum-b+i].v1=vex[j];
//建立弧数组
edge[arcnum-b+i].v2=vex[k];
edge[arcnum-b+i].edgeweight=weight;
可以在无向图中删除结点
inti,j,flag=0;
inti,j,flag=0;
if(edge[i].v1==c||edge[i].v2==c)
edge[i].edgeweight=MAX;
//该边权值为MAX表示两点之间不连通或者两点重合
if(vex[i]==c)
vex[i]='
*'
;
//以‘*’表示改点已被删除
j=i;
flag=1;
if(flag==0)
printf("
\n该结点不存在!
return;
a[j][i]=MAX;
a[i][j]=MAX;
可以在无向图中增加含权的边
intj,k,c,i;
addedge(charp,charq,floatweight)//增加含权的边
intj,k,c,i;
arcnum++;
arcnum-1;
edge[arcnum-1].v1=vex[j];
edge[arcnum-1].v2=vex[k];
edge[arcnum-1].edgeweight=weight;
可以在无向图中删除含权的边
inti,j,k,flag=0;
None;
inti,j,k,flag=0;
if((edge[i].v1==c&
&
edge[i].v2==b)||(edge[i].v1==b&
edge[i].v2==c))
if(flag==0)
\n该边不存在!
return;
if(vex[i]==b)
k=i;
a[j][k]=MAX;
a[k][j]=MAX;
可以在无向图中求图中结点的个数
inti,num=0;
inti,num=0;
if(vex[i]!
='
)
num++;
图中结点的个数为:
%d"
num);
结点分别为:
for(i=0;
if(vex[i]!
printf("
%c"
vex[i]);
}
可以在无向图中求图中边的个数
inti,j,num=0;
inti,j,num=0;
if(a[i][j]!
=MAX)
num++;
图中边的个数为:
num/2);
前向递归查找路径上的顶点
intk;
Ppath(intpath[],inti,intv)//前向递归查找路径上的顶点
intk;
k=path[i];
if(k==v)return;
//找到了起点则返回
Ppath(path,k,v);
//找顶点k的前一个顶点
%c,"
vex[k]);
//输出顶点k
输出路径
inti;
inti;
n;
if(s[i]==1)
if(v!
=i)
{
从%c到%c的最短路径长度为:
%f路径为:
vex[v],vex[i],dist[i]);
vex[v]);
//输出路径上的起点
Ppath(path,i,v);
//输出路径上的中间点
%c\n"
//输出路径上的终点
}
else
从%c到%c不存在路径\n"
vex[v],vex[i]);
deletedist;
deletepath;
deletes;
用Dijkstra算法求单源最短路径即在无向图中查找两结点间的最小连通边
float*s,*dist,mindis;
*int*path;
*inti,j,u;
int*path;
inti,j,u;
s=newfloat[nodenum];
dist=newfloat[nodenum];
path=newint[nodenum];
i++)//分别对dist[N],path[N],和s[N]初始化
{
dist[i]=a[v][i];
//距离初始化
s[i]=0;
//s[]置空
if(a[v][i]<
MAX)//路径初始化
path[i]=v;
else
path[i]=-1;
s[v]=1;
path[v]=0;
//源点编号v放入s中
i++)//循环直到所有顶点的最短路径都求出
mindis=MAX;
//mindis置最小长度初值
j++)/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 实践