c語言實現迪傑斯特拉算法(鄰接表)


儲存結構,結構體的定義:(權值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);
 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM