儲存結構,結構體的定義:(權值w用於表示兩點間路徑的花費)
typedef int Status; typedef struct ENode//圖的鄰接表定義 { int adjVex;//任意頂點u相鄰接的頂點 int w;//邊的權值 struct ENode* nextArc;//指向下一個邊結點 }ENode; typedef struct LGraph { int n;//圖的當前頂點數 int e;//圖的當前邊數 ENode **a;//指向一維指針數組 }LGraph;
迪傑斯特拉算法:
int Choose(int *d, int *s,int n) //每次選擇一個為加入數組s【】的具有最小權值的結點 { int i,minpos,min; min=INFTY; minpos=-1; for(i=0;i<n;i++) { if(d[i]<min&&!s[i]) { min=d[i]; minpos=i; } } return minpos; } Status Dijkstra(int v,int *d,int *path,LGraph *lg)//迪傑斯特拉算法求路徑 { int i,j,k,w; ENode *p; p=lg->a[v];//工作指針 int *s; if(v<0||v>lg->n-1) { return ERROR; } s=(int*)malloc(sizeof(int)*lg->n); for(i=0;i<lg->n ;i++) { s[i]=0; path[i]=-1; d[i]=INFTY; } while(p)//初始化 { d[p->adjVex ]=p->w ; if(p->adjVex!=v&&d[p->adjVex ]<INFTY) { path[p->adjVex ]=v; } p=p->nextArc ; } //對各個數組初始化 s[v]=1; d[v]=0; for(i=1;i<lg->n ;i++) { k=Choose(d,s,lg->n ); if(k==-1) { continue; } //判斷是否選擇了有效結點 s[k]=1; p=lg->a[k]; if(p==NULL) { continue ; } while(p) { if(!s[p->adjVex ]&&d[k]+p->w <d[p->adjVex ])//更新d和path { d[p->adjVex ]=d[k]+p->w ; path[p->adjVex ]=k; } p=p->nextArc ; } } return OK; } void fun(LGraph *lg)//此函數用於輸出路徑 { int v,u; printf("please input u and v:\n"); scanf("%d %d",&u,&v); int d[lg->n]; int path[lg->n]; Dijkstra(u,d,path,lg); printf("path: "); if(path[v]==-1) { printf("無\n"); return ; } while (path[v]!=-1) { printf("%d <--- ",v); v=path[v]; } printf("%d\n",u); }