图论 迪杰斯特拉dijkstra求最短路径
来源:互联网 发布:淘宝怎么取消手机绑定 编辑:程序博客网 时间:2024/05/22 12:06
这个测试用的是下面这个图:
9 16
0 1 2 3 4 5 6 7 8
0 1 1
0 2 5
1 2 3
1 4 5
1 3 7
2 4 1
2 5 7
3 4 2
3 6 3
4 6 9
4 5 3
4 7 9
5 7 5
6 7 2
6 8 7
7 8 4
运行结果如下:
#include<stdio.h>#include<string.h>#include<iostream>#include<cmath>#define inf 0x3f3f3f3f#include<algorithm>typedef struct Graph{ int vertex[100]; int arc[100][100]; int num_ver,num_edge;} Mygraph;void create(Mygraph *g)//建图{ int i,j,tmp,a,b,c; scanf("%d%d",&g->num_ver,&g->num_edge);//输入结点数和边数 for(i=0; i<g->num_ver; i++)//输入结点集 scanf("%d",&g->vertex[i]); for(i=0; i<g->num_ver; i++)//边的权值初始化 { for(j=0; j<g->num_ver; j++) g->arc[i][j]=inf; } for(i=0; i<g->num_edge; i++)//输入边的权值 { scanf("%d%d%d",&a,&b,&c); g->arc[a][b]=c; g->arc[b][a]=c; }}void ShortPath(Mygraph *g,int x){ int i,j,k,tmp,Min; int adjver[100]; int final[100]; int sum=0; memset(final,0,sizeof(final)); int lowcost[100]; final[x]=1; //其实这个算法跟prime算法实现很相似,制作了一些很小的改动 //就新增了一个final数组,用来记录这个点是够走过,如果走过就不再走,因为如果记录final[k]=1,那么 //就是认为到达k点最短路径就是当前的样子,不能是其他的 for(i=0; i<g->num_ver; i++) { lowcost[i]=g->arc[x][i]; adjver[i]=x; } lowcost[x]=0; for(i=0; i<g->num_ver; i++) { Min=inf;//Min用来找最小的边权值 j=0; while(j<g->num_ver) { if(!final[j]&&lowcost[j]<Min) { Min=lowcost[j]; k=j; } j++; } //现在k里存的是从当前以选择结点出发可以到达的最近的结点(即边权值最小) final[k]=1; for(j=0; j<g->num_ver; j++) { if(!final[j]&&Min+g->arc[k][j]<lowcost[j]) { lowcost[j]=Min+g->arc[k][j]; adjver[j]=k; } } } printf("adjver[]:\n"); for(i=0; i<g->num_ver; i++) printf("%3d ",adjver[i]); puts(""); printf("lowvost[]:\n"); for(i=0; i<g->num_ver; i++) printf("%3d ",lowcost[i]); puts(""); /*打印0到8的路径*/ /* int ans[10]; int temp=8,cout_ans=0; ans[cout_ans++]=8; while(adjver[temp]!=0){ ans[cout_ans++]=adjver[temp]; temp=adjver[temp]; } ans[cout_ans++]=0; for(i=cout_ans-1;i>=0;i--) printf("%d ",ans[i]); printf("\n"); */}int main(){ int i,j,k,x,y,z; Mygraph G; printf("第一次测验\n"); create(&G); ShortPath(&G,1); printf("第二次测验\n"); create(&G); ShortPath(&G,0); return 0;}/*5 60 1 2 3 40 1 90 2 20 4 61 2 32 3 53 4 19 160 1 2 3 4 5 6 7 80 1 10 2 51 2 31 4 51 3 72 4 12 5 73 4 23 6 34 6 94 5 34 7 95 7 56 7 26 8 77 8 4*/
阅读全文
0 0
- 图论 迪杰斯特拉dijkstra求最短路径
- 【算法小总结】迪杰斯特拉(Dijkstra)求最短路径
- Dijkstra求最短路径
- 求最短路径(dijkstra)
- dijkstra 求最短路径算法
- dijkstra 求最短路径
- Dijkstra算法求最短路径
- Dijkstra 算法求最短路径
- 解析dijkstra求最短路径
- Dijkstra算法求最短路径
- Dijkstra算法求最短路径
- Dijkstra 求最短路径算法
- Dijkstra求最短路径
- dijkstra求最短路径(水题)
- Dijkstra算法 ---求最短路径
- Dijkstra求最短路径
- dijkstra求最短路径长度
- Dijkstra算法求最短路径
- HDU6053(72/600)
- Java常用类及其方法(一)Object
- 设计模式之禅笔记-原型模式
- c语言——关于二维数组和指针
- mysql修改密码策略和密码
- 图论 迪杰斯特拉dijkstra求最短路径
- matlab中利用princomp实现PCA降维
- Arcgis中地理坐标系和投影坐标区别及操作
- HDU
- matlab中fminunc函数的使用
- 数据结构 c语言 折半查找算法(保证有序)
- 卡特兰数
- 配置dubbo时xml文件找不到dubbo.xsd
- Could not find a getter for userState in class com.zj.entity.Users