C++实践Word下载.docx

上传人:b****5 文档编号:17573757 上传时间:2022-12-07 格式:DOCX 页数:30 大小:55.58KB
下载 相关 举报
C++实践Word下载.docx_第1页
第1页 / 共30页
C++实践Word下载.docx_第2页
第2页 / 共30页
C++实践Word下载.docx_第3页
第3页 / 共30页
C++实践Word下载.docx_第4页
第4页 / 共30页
C++实践Word下载.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

C++实践Word下载.docx

《C++实践Word下载.docx》由会员分享,可在线阅读,更多相关《C++实践Word下载.docx(30页珍藏版)》请在冰豆网上搜索。

C++实践Word下载.docx

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++)/

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 高中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1