判别无向图中任意两个顶点之间是否存在长度为K的简单路径c语言版.docx
- 文档编号:8684041
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:8
- 大小:15.57KB
判别无向图中任意两个顶点之间是否存在长度为K的简单路径c语言版.docx
《判别无向图中任意两个顶点之间是否存在长度为K的简单路径c语言版.docx》由会员分享,可在线阅读,更多相关《判别无向图中任意两个顶点之间是否存在长度为K的简单路径c语言版.docx(8页珍藏版)》请在冰豆网上搜索。
判别无向图中任意两个顶点之间是否存在长度为K的简单路径c语言版
C语言代码:
#include"stdio.h"
#include"stdlib.h"
#defineMax15
#definelist_size20
typedefstructGraph//邻接矩阵
{
charpoint[Max];
intline[Max][Max];
intlinenum,pointnum;
}Graph;
typedefstructNode//顺序表中元素
{
charc;
structkey*next;
}Node;
typedefstructkey//链表节点
{
charc;
intleng;
structkey*next;
}key;
typedefstruct//顺序表
{
Node*top;
intlength;
intsize;
}Sqlist;
intlocal(Sqlistl,charv)
{
inti,j=-1;
for(i=0;i if(l.top[i].c==v) j=i; returnj; } GraphCreat(Graphg) { inti,j; printf("请输入图的点数: "); scanf("%d",&g.pointnum); printf("\n————顶点————\n"); getchar(); printf("输入一个图中的顶点: "); for(i=0;i { if(i) printf("继续输入一个顶点: "); scanf("%c",&g.point[i]); getchar(); } for(i=0;i for(j=0;j g.line[i][j]=0; printf("\n————边————\n"); printf("\n请输入邻接矩阵: (带权值的)\n\n"); for(i=0;i { for(j=0;j scanf("%d",&g.line[i][j]); getchar(); } returng; } SqlistInit(Sqlistl) { l.top=(Node*)malloc(list_size*sizeof(Node)); if(! l.top) exit(0); l.length=0; l.size=list_size; returnl; } SqlistCreat_list(Sqlistl,Graphg) { inti,j,flage=0; Node*newbase; key*element,*first; for(i=0;i { if(l.length>=l.size) { newbase=(Node*)realloc(l.top,(l.size+list_size)*sizeof(Node)); if(! newbase) exit(0); l.top=newbase; l.size+=list_size; } l.top[i].c=g.point[i]; l.length++; } for(i=0;i { flage=0; l.top[i].next=0; for(j=0;j { if(g.line[i][j]! =0) { flage++; if(flage==1) { element=(key*)malloc(sizeof(key)); element->next=0; element->c=g.point[j]; element->leng=g.line[i][j]; l.top[i].next=element; first=element; } else { element=(key*)malloc(sizeof(key)); element->next=0; element->c=g.point[j]; element->leng=g.line[i][j]; first->next=element; first=element; } } } } returnl; } voiddisplay(Sqlistl) { inti; key*f; Node*e; printf("\n——————邻接表——————\n"); for(i=0;i { if(l.top[i].next! =0) { printf("%c->",l.top[i].c); f=l.top[i].next; while(f->next) { printf("%c,%d->",f->c,f->leng); f=f->next; } printf("%c,%d",f->c,f->leng); printf("\n"); } else printf("%c\n",l.top[i].c); } printf("\n"); } charpath[Max]={0}; intvisit[Max]={0}; intflage=0; intpath_length; voidprint_path(charpath[]) { inti=0; while(path[i+1]) { printf("%c->",path[i]); i++; } printf("%c",path[i]); printf("\n"); } voidfind_path(Sqlistl,charv,charw,intk,intj,key*p) { charaim; intm,flage1=0; while(p) { aim=p->c; m=local(l,aim); if(! visit[m]) { flage=1; k-=p->leng; path[j]=aim; visit[m]=1; if(aim==w) { if(k==0) { printf("两顶点之间存在长度为%d的路径: ",path_length); print_path(path); } else { printf("两顶点之间不存在长度为%d的路径,但存在可达路径",path_length); print_path(path); } flage=1; } else find_path(l,aim,w,k,j+1,l.top[m].next); } if(flage==1) { k+=p->leng; visit[m]=0; } p=p->next; } } voidmain() { Graphg; Sqlistlist; charv,w; intk,i=0,j; key*point; g=Creat(g); list=Init(list); list=Creat_list(list,g); display(list); getchar(); printf("请输入任意两个顶点: "); scanf("%c,%c",&v,&w); printf("请输入路径长度: "); scanf("%d",&k); path_length=k; j=local(list,v); path[0]=v; visit[j]=1; find_path(list,v,w,k,i+1,list.top[j].next); if(flage==0) printf("两顶点之间不存在路径! \n"); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 判别 任意 两个 顶点 之间 是否 存在 长度 简单 路径 语言版