无向图的生成两种遍历方法以及最小生成树的构建c++代码实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
无向图的遍历及其算法
#include
#include
#define max 50
int n,e;
int visited1[max]; //访问标记
int visited2[max];
int visited3[max];
double quan[max][max]; //存取权值
int visited4[max];
double zh=0.0; //权值之和
struct link //结点定义
{ int data;
double cost;
link *next;
};
struct syz //存取路径的两个端点及其权值
{ int h;
int l;
double z;
}syz[max];
struct Adjlist //存取顶点
{ int v;
link *next;
}Adjlist[max];
void c_cbs_graph (int n, int e ) //创建无向图
{ int i,j,k ;
double c;
link *s ;
for (i=1; i<=n; i++)
{ /*建立邻接表头结点*/
Adjlist[i].v=i ; Adjlist[i].next=NULL;
}
cout< for (k=1; k<=e;k++) { cout<<"请输入第"< cin>>i>>j>>c; cout< s=new link; /*申请一个动态存储单元*/ s->data=j ; s->cost=c; s->next=Adjlist[i].next ; Adjlist[i].next=s ; s=new link; s->data=i ; s->cost=c; s->next=Adjlist [j].next ; Adjlist[j].next=s ; } }; void DFS( int i ) //深度优先遍历 { // i是遍历起始点的在邻接表中的下标值,其下标从1开始 link *p; cout< visited1[i]=1; p = Adjlist[i].next; while(p!=NULL) { if (visited1[p->data]==0) DFS (p->data); p=p->next; } }; void BFS(int i) //广度优先遍历 { int q[max]; /*定义队列*/ int fro,rea; link *p ; /*P为搜索指针*/ fro=rea=0 ; cout< visited2[i]=1 ; rea++; q[rea]=i ; /*进队*/ while (fro { fro++ ; i=q[fro] ; p=Adjlist[i].next; while (p!=NULL) { if (visited2[p->data]==0) { cout< visited2[p->data]=1 ; rea++; q[rea]=p->data ; } p=p->next; } } }; void R() //存入权值 { int i,j; link *r; for(i=0;i for(j=0;j quan[i][j]=0; for(i=0;i { r=Adjlist[i+1].next; while(r!=NULL) { quan[i][(r->data)-1]=r->cost; quan[(r->data)-1][i]=r->cost; r=r->next; } } }; void Min(int c) //查找权值最小的路径 { int i; syz[max].h=syz[0].h; syz[max].l=syz[0].l; syz[max].z=syz[0].z; for(i=0;i { if(syz[max].z>syz[i].z) {syz[max].h=syz[i].h; syz[max].l=syz[i].l; syz[max].z=syz[i].z; } } }; void Prim(int v) //算法一,求最小生成树 { int i,cout=1; for(i=max;i>=max-n;i--) { Adjlist[i].v=0; Adjlist[i].next=NULL;} Adjlist[max].v=v;