|
|
#2
chenhaiquanw2010-12-05 07:26
#include <stdio.h>
#include <stdlib.h> #define MAXLENTH 1000 int cost[7][7]; //存放图的邻接矩阵 int dist[7]; //存放最顶点的最短路径 /////////////////////////////////////////////////////////////////////// // // 函数名 : creategraph // 功能描述 : 用数组的方法创建图(node存放的是比如1 2 3 意思是1->2之间的距离为3) // 参数 : int * node // 参数 : int num // 返回值 : void // /////////////////////////////////////////////////////////////////////// void creategraph(int * node,int num) { int from; int to ; int i; for(i=0;i<num;i++) { from=node[3*i]; to=node[3*i+1]; cost[from][to]=node[3*i+2]; } } /////////////////////////////////////////////////////////////////////// // // 函数名 : shortestpath // 功能描述 : dijkstra算法 // 参数 : int begin // 参数 : int num // 返回值 : void // /////////////////////////////////////////////////////////////////////// void shortestpath(int begin,int num) { int selected[7]; int min; int s; int i; int j; for(i=2;i<=num;i++) { dist[i]=cost[begin][i];//(dist初始化为存放从begin 这一点到其他顶点值) selected[i]=0; //一个指示的数组,1表明算过了,0是初始值 } dist[begin]=0; selected[begin]=1; printf("顶点1 2 3 4 5 6\n"); for(i=1;i<=num;i++) { printf(" %4d ",dist[i]); //初始化的路径长短. } printf("\n"); for(i=1;i<=num-1;i++) { min=MAXLENTH; for(j=1;j<=num;j++)//从dist中找到最小的并且未标记的那个顶点,并标志为已算过 { if(min > dist[j] && selected[j] == 0) { s=j; min=dist[s]; } } selected[s]=1; for(j=1;j<=num;j++) //根据找到的顶点进行修改dist数组,即原来的值dist[j]与(先到与经过刚刚找到的顶点s值dist[s],加上从s到j的距离cost[s][j]) { if(dist[j] > (dist[s]+cost[s][j] )&& selected[j]==0)//比较发现先经过s再到j的距离比较小(且未标记过)则进行修改 { dist[j]=dist[s]+cost[s][j]; } printf(" %4d ",dist[j]); } printf("\n"); } } void main() { int i; int j; int node[7][3]= { {1,2,35}, {2,3,45}, {2,4,30}, {3,5,25}, {4,5,45}, {4,6,130}, {5,6,100} }; for(i=1;i<=6;i++) for(j=1;j<=6;j++) { cost[i][j]=MAXLENTH; //图的邻接矩阵的初始化.MAXLENTH=1000(意为无穷, 顶点之间不可达) } creategraph(node,6); //创建图 printf("带权图的矩阵\n"); for(i=1;i<=6;i++) //输出邻接矩阵 { for(j=1;j<=6;j++) printf(" %4d ",cost[i][j]); printf("\n"); } printf("从顶点1到各顶点最短距离计算过程\n"); shortestpath(1,6); } |
关于最短路径的问题(迪杰斯特拉算法)不是很明白,希望能举一到两个例子(邻接表或邻接矩阵),并附带说明,不胜感激