单源点最短路径
来源:互联网 发布:大数据挖掘工程师 编辑:程序博客网 时间:2024/06/05 00:59
#include <stdio.h>#define INF 10000#define N 8int adj_mtx[N][N];int pre[N];int visited[N];int v;void set(int i, int j, int dist){ adj_mtx[i][j] = dist; adj_mtx[j][i] = dist;}void init(){ int i,j,k; for(i=0;i<N;i++) visited[i]=0; visited[v]=1; for(i=0;i<N;i++) for(j=0;j<N;j++) adj_mtx[i][j]=INF; set(v,v,0); set(0,1,8); set(0,2,3); set(0,3,2); set(1,4,3); set(2,5,4); set(3,6,5); set(4,5,1); set(5,6,2); set(4,7,1); set(5,7,3); set(6,7,4); for(i=0;i<N;i++) pre[i]=0; for(i=0;i<N;i++) { // if(i==v) continue; if(adj_mtx[v][i]!=INF) pre[i]=v; }}void dijikstra(){ int min_dist=INF,min_index=-1; int i,j,k; for(i=0;i<N;i++) { min_dist=INF,min_index=-1; for(j=0;j<N;j++) if(!visited[j] && adj_mtx[v][j]<min_dist){ min_dist=adj_mtx[v][j]; min_index=j;} if(min_index!=-1) {visited[min_index]=1;for(k=0;k<N;k++) if(!visited[k] && adj_mtx[v][min_index]+adj_mtx[min_index][k]<adj_mtx[v][k]) { adj_mtx[v][k]=adj_mtx[v][min_index]+adj_mtx[min_index][k]; pre[k]=min_index; } } } }void output_path(int dest_node){ // printf("output_path destnode:%d\n"+dest_node); if(v==dest_node) { printf("%d ",dest_node); return ; } output_path(pre[dest_node]); printf("%d ",dest_node);}void output_result(){ int i; for(i=0;i<N;i++) {printf("to node %d, min dist is:%d\n",i,adj_mtx[v][i]);printf("path is:\n"); output_path(i);printf("\n"); }}void output(){ int i,j; printf("\npre:\n\n"); for(i=0;i<N;i++) printf("%d ",pre[i]); printf("\n\nadj_mtx:\n\n"); for(i=0;i<N;i++) { for(j=0;j<N;j++) printf("%-5d ",adj_mtx[i][j]); printf("\n"); }}int main(){ v=0; init(); dijikstra(); output_result(); //output(); return 0;}