单源点最短路径

来源:互联网 发布:大数据挖掘工程师 编辑:程序博客网 时间: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;}

原创粉丝点击