dijstra演算法 c語言實現

來源:互聯網
上載者:User

看來群的作用真的很大啊

剛才為了一下,發現自己的抽象思維能力簡直為0

總以為沒有辦法處理集合,然後群裡面的人說可以用bool 數組,然後研究了一下,果然可以

演算法描述的時候說集合的並啊,減啊,在c語言裡,用個bool數組就可以,

剛開始初始化為false

然後進來一個true一個

發現還是自己寫程式容易理解,個別的知識點再問別人,剛才搜一下別人怎麼實現的,那個長啊,根本不願意讀

也不理解。程式還是自己寫的,自己理解啊

/*author :linglingdate:2011-10-8description: 有向圖鄰接矩陣的建立,串連矩陣的深度優先遍曆,dijkstral求一個頂點到其餘各頂點的最短距離*/#include <stdio.h>#include <stdlib.h>#define MaxVertexNum 100typedef int VertexType ;  //由使用者定義頂點類型typedef int EdgeType;      //由使用者定義邊上的權實值型別typedef struct  {VertexType vexs[MaxVertexNum];EdgeType edges[MaxVertexNum][MaxVertexNum];    int n,e;}MGrap;bool visited[MaxVertexNum];void createMGrap(MGrap*);void DFSTraverse(MGrap* );void DFS(MGrap* , int );void Dijkstra(MGrap* ,int,int[]);void main(){    freopen("input1.txt","r",stdin);MGrap *G =(MGrap*)malloc(sizeof(MGrap));    createMGrap(G);    for (int i=0;i<G->n;i++)    {  for(int j=0;j<G->n;j++)  {  printf("%-8d",G->edges[i][j]);    }  printf("\n");   }   DFSTraverse(G);      int D[5];   Dijkstra(G,0,D);}void createMGrap(MGrap* G){  int i,j,k,w=0,p;//  printf("輸入頂點數和邊數\n");  scanf("%d,%d",&G->n,&G->e);   for ( p=0;p<G->n;p++)  {  //fflush(stdin);       //清除緩衝區//  printf("輸入頂點資訊");  scanf("%d",&G->vexs[p]);  } // printf("鄰接矩陣初始化\n");  for ( i=0;i<G->n;i++)  for ( j=0;j<G->n;j++)     G->edges[i][j]=1000;   for ( k=0;k<G->e;k++)  {   //printf("讀入兩個頂點(i,j)之間邊的值w\n");  scanf("%d,%d,%d",&i,&j,&w);  G->edges[i][j]=w; // G->edges[j][i]=w; // printf("讀入的數i=%d,j=%d,w=%d\n",i,j,w);  }}void DFSTraverse(MGrap* G){int i;for (i=0;i<G->n;i++)visited[i]=false;printf("深度優先遍曆序列:\n");for (i=0;i<G->n;i++)  //確保每一個頂點都遍曆過,如果有孤立的也可以if (!visited[i]){DFS(G,i);}printf("\n");}void DFS(MGrap* G, int i){printf("%d->",G->vexs[i]);//fflush(stdout);visited[i]=true;for (int j=0;j<G->n;j++)if (G->edges[i][j]==1&&!visited[j])DFS(G,j);}void Dijkstra(MGrap* G ,int s,int D[]){   int k=0;   D[s]=0;   for (int i=0;i<G->n;i++)   visited[i]=false;   visited[s]=true;   //初始化最短距離一維數組   for (int i=0;i<G->n;i++)    if (!visited[i])   D[i]=G->edges[s][i];   //修改最短距離一維數組  for (int i=0;i<G->n-1;i++)  {  //找出最小的值,下次找的時候不包括已經找到的      int min =1000;  for (int j=0;j<G->n;j++)     {  if (!visited[j]&&D[j]<min) { min=D[j]; k=j; }      }   visited[k]=true;  printf("最小值的下標%d\n",k);  //修改剩餘點的距離值  for (int j=0;j <G->n;j++)     if (!visited[j]&& D[j]>D[k]+G->edges[k][j] )  D[j]= D[k]+G->edges[k][j];  }  for (int i=0;i<G->n;i++)  {  printf("s到頂點%d的最短距離%d\n",i,D[i]);  }  printf("\n");}

 

 

最後這部分是這個演算法,其餘的部分還是以前寫的,在這個基礎上寫的,要不然也不能隨便一個演算法就能執行的啊

結果

直觀圖

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.