dijkatra算法的实现
来源:互联网 发布:sqlserver免费版 编辑:程序博客网 时间:2024/06/10 09:59
/*完成度1基本要求2随意命名3有向图*/#include<stdio.h>#include<string.h>#include<stdbool.h>#define VEX_MAX 50char vex[VEX_MAX][20];int arcweight[VEX_MAX][VEX_MAX],vexnum;int way[VEX_MAX][VEX_MAX];void creategraph(){ int i,j; printf("输入顶点:\n"); for(i=0;i<VEX_MAX;i++){ scanf("%s",vex[i]); if(vex[i][0]=='0')break;//0作为结束标记 } vex[i][0]='\0'; vexnum=i;//记录顶数目 //for(i=0;vex[i][0]!='\0';i++){ // printf("%s\n1\n",vex[i]); // } for(i=0;i<vexnum;i++) for(j=0;j<vexnum;j++){ if(i==j)arcweight[i][j]=0; else arcweight[i][j]=99999999;//初始化所有边不联通 } printf("选择图的类型 1.无向图 2.有向图:"); int type; scanf("%d",&type); if(type==1){ printf("输入边以及相应权值,格式为:端点,端点,权值\n"); char temp1[20],temp2[20],temp3[]={'0','\0'}; int a,b,weight; while(1){ scanf("%s",temp1); if(strcmp(temp1,temp3)==0)break; scanf("%s%d",temp2,&weight); for(i=0;i<vexnum;i++){ if(strcmp(temp1,vex[i])==0)a=i; if(strcmp(temp2,vex[i])==0)b=i; } arcweight[a][b]=weight; arcweight[b][a]=weight; } } else if(type==2){ printf("输入边以及相应权值,格式为:尾,头,权值\n"); char temp1[20],temp2[20],temp3[]={'0','\0'}; int a,b,weight; while(1){ scanf("%s",temp1); if(strcmp(temp1,temp3)==0)break; scanf("%s%d",temp2,&weight); for(i=0;i<vexnum;i++){ if(strcmp(temp1,vex[i])==0)a=i; if(strcmp(temp2,vex[i])==0)b=i; } arcweight[a][b]=weight; } } else printf("错误,必须选择二者之一");}void findsway(char*u,char*v){ int a,b,i,j; bool flag[vexnum],path[vexnum][vexnum]; for(i=0;i<vexnum;i++){ if(strcmp(u,vex[i])==0)a=i; if(strcmp(v,vex[i])==0)b=i; } int distance[vexnum]; for(i=0;i<vexnum;i++){ flag[i]==false; distance[i]=arcweight[a][i]; for(j=0;j<vexnum;j++)path[i][j]=false;//空路径 if(distance[i]<99999999){path[i][a]=true;path[i][i]=true;} } distance[a]=0;flag[a]=true; for(i=0;i<vexnum-1;i++){//执行vexnum-1次,然后得到生成树 int min=99999999,c; for(j=0;j<vexnum;j++) if(!flag[j]) if(distance[j]<min){c=j;min=distance[j];} flag[c]=true;//循环结束后c为离a最近的顶 for(j=0;j<vexnum;j++) if(!flag[j]&&(min+arcweight[c][j])<distance[j]){ distance[j]=min+arcweight[c][j]; int k; for(k=0;k<vexnum;k++)path[j][k]=path[c][k]; path[j][j]=true; }//if }//for //输出路径以及权值 printf("%s到%s之间的路径最短长度为%d,具体见下方表示,数字为%s到各个点的距离\n",u,v,distance[b],u); int num=0,max=0,mark,k=0; for(i=0;i<vexnum;i++)//为了顺序输出的操作 if(path[b][i])num++;//计算顶点数 int way[num]; for(i=0;i<vexnum;i++) if(path[b][i]){way[k]=i;k++;} for(i=0;i<num;i++){ max=0; for(j=0;j<num-i;j++) if(distance[way[j]]>=max){max=distance[way[j]];mark=j;} int swaptemp; swaptemp=way[num-1-i]; way[num-1-i]=way[mark]; way[mark]=swaptemp; } for(i=0;i<num-1;i++) printf("%s%d-->",vex[way[i]],distance[way[i]]); printf("%s%d",vex[way[i]],distance[way[i]]);}//findswayint main(){ char u[20],v[20]; creategraph(); printf("输入你的路线起点与终点,请确保二者之间至少有一条路径\n"); scanf("%s%s",u,v); findsway(u,v); return 0;}
阅读全文
0 0
- dijkatra算法的实现
- 最短路径算法----Dijkatra
- Dijkatra 算法 计算一个点到其他点的最短路径
- Dijkatra 迪克斯特拉双栈算术表达式求值算法 Java
- Dijkatra+Head_poj3268
- Codevs_P1021 热浪(Dijkatra)
- 梅西迭代算法的实现
- CRC算法的实现...
- Hanoi的实现算法
- 图算法的实现
- LRU算法的实现
- 组合算法的实现
- kruskal算法的实现
- KMP算法的实现
- 排序算法的实现
- RSA算法的实现
- PID算法的实现
- Adler32算法的实现
- 智能指针
- Pygame 中播放 MPEG 视频的模块。
- Android EventBus事件总线
- hashmap如何初始化
- 汽水瓶
- dijkatra算法的实现
- MapReduce 的体系结构
- Pygame 中控制音频流的模块
- JVM 内存区域以及内存溢出和内存泄露
- mysql初学
- 运维自动化工具Ansible
- xXx隐私助手1.0
- 查找输入整数二进制中1的个数
- sql手注实践之dvwa