欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來到入門教程網(wǎng)!

C語(yǔ)言

當(dāng)前位置:主頁(yè) > 軟件編程 > C語(yǔ)言 >

Dijkstra算法最短路徑的C++實(shí)現(xiàn)與輸出路徑

來源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:C語(yǔ)言|點(diǎn)擊: 次

某個(gè)源點(diǎn)到其余各頂點(diǎn)的最短路徑

這個(gè)算法最開始心里怕怕的,不知道為什么,花了好長(zhǎng)時(shí)間弄懂了,也寫了一遍,又遇到時(shí)還是出錯(cuò)了,今天再次寫它,心里沒那么怕了,耐心研究,懂了之后會(huì)好開心的,哈哈

Dijkstra算法:

圖G

如圖:若要求從頂點(diǎn)1到其余各頂點(diǎn)的最短路徑,該咋求;

迪杰斯特拉提出“按最短路徑長(zhǎng)度遞增的次序”產(chǎn)生最短路徑。

首先,在所有的這些最短路徑中,長(zhǎng)度最短的這條路徑必定只有一條弧,且它的權(quán)值是從源點(diǎn)出發(fā)的所有弧上權(quán)的最小值,例如:在圖G中,從源點(diǎn)1出發(fā)有3條弧,其中以?。?,2)的權(quán)值為最小,因此,(1,2)不僅是1到2的一條最短路徑,并且它可能是源點(diǎn)到其它各個(gè)終點(diǎn)的最短路徑中的一條子路徑。

其次,第二條長(zhǎng)度次短的最短路徑只可能有兩種情況:①它或者只含一條從源點(diǎn)出發(fā)的弧且弧上的權(quán)值大于已求得最短路徑的那條弧的權(quán)值,但小于其他從源點(diǎn)出發(fā)的弧上的權(quán)值②它或者是一條只經(jīng)過已求得最短路徑的頂點(diǎn)的路徑。

例如圖G中,從1到其他各點(diǎn)。過程中,用d[i]保存從1到i的的最短路徑(過程會(huì)變化),初值為:若源點(diǎn)到該源點(diǎn)有弧,則為權(quán)值,否則初始化為無窮大,每求得一條到達(dá)某個(gè)終點(diǎn)i的最短路徑,就繼續(xù)檢查是否存在以此路徑為子路徑的到達(dá)其他點(diǎn)的最短路徑,若存在,判斷其長(zhǎng)度是否比當(dāng)前求得的路徑長(zhǎng)度短,若短,就更新為更短的長(zhǎng)度。

如圖G中,求得到2的最短路徑d[2]為10,就把d[2]作為與2相連的到其他點(diǎn)的子路徑繼續(xù)檢查,得到到3的最短路徑為d[2]+50=60

過程:

(1).令S={1},S集合中表示已經(jīng)找到最短路徑的結(jié)點(diǎn),開始時(shí)1為源點(diǎn),并設(shè)定d[i]的初始值為:d[i]=(1,i),

(2).求出到j(luò)點(diǎn)的最短路徑,j點(diǎn)為不在S集合中的某點(diǎn)

d[j]=min{d[i]}

(3).判斷所有沒在S集合中的頂點(diǎn)k,若d[k]>d[j]+(j,k)則修改d[k]的值為:

d[k]=d[j]+(j,k)

(4).重復(fù)(2).(3)操作共n-1次,每次操作,在(2)得到一個(gè)到

某點(diǎn)的最短路徑。

有向圖求最短路徑

#include<stdio.h>
#include<string.h> 
#include<stdlib.h>
#define max 900000000
//有向圖 
int main(){
  int n,m,a,b,v,i,j,min,k;
  scanf("%d%d",&n,&m);//輸入n個(gè)頂點(diǎn),m條邊 
  int g[n+1][n+1],d[n+1],vis[n+1];//g[i][j]表示i到j(luò)的邊的權(quán)值,vis[i]表示到此頂點(diǎn)的最短路是否已經(jīng)找到,d[i]當(dāng)前源點(diǎn)到i頂點(diǎn)的最短路徑 
  memset(vis,0,sizeof(vis));
  for(i=0;i<=n;i++){ 
    for(j=0;j<=n;j++){
      g[i][j]=max;
    }
    d[i]=max;  
  }
  for(i=0;i<m;i++){//i到j(luò)的邊權(quán)值儲(chǔ)存到g鄰接矩陣中,i點(diǎn)到j(luò)點(diǎn)無直接相連的邊時(shí),g[i][j]=max 
    scanf("%d%d%d",&a,&b,&v);
    g[a][b]=v;
  }
  for(i=2;i<=n;i++){
      d[i]=g[1][i]; //初始化源點(diǎn)到i點(diǎn)邊權(quán)值,之后過程中會(huì)發(fā)生變化 
  }
  vis[1]=1;
  for(i=2;i<=n;i++){//共循環(huán)n-1次,每循環(huán)一次,確定一條最短路,再次循環(huán)時(shí)這條路就不用考慮了,去尋找下一條最短路 
    min=max;
    for(j=2;j<=n;j++){//尋找下一條當(dāng)前最短路 
      if(d[j]<min&&vis[j]==0){
       min=d[j];
       k=j;
      }  
    }
    vis[k]=1;//找到了,到k點(diǎn)的路是當(dāng)前最短路,標(biāo)記它,根據(jù)它尋找下一條最短路 
    for(j=2;j<=n;j++){
      if(d[j]>d[k]+g[k][j]&&vis[j]==0){//經(jīng)過此k點(diǎn)到達(dá)j點(diǎn)的路徑是否小于其他到達(dá)j點(diǎn)的路徑 
        d[j]=d[k]+g[k][j];
      }
    }
  }  
  for(i=2;i<=n;i++){//輸出到達(dá)個(gè)點(diǎn)的最短路徑 
    printf("%d\n",d[i]);
  }
  return 0;
}

無向圖求最短路徑

無向圖也是相同思路:在構(gòu)造鄰接矩陣時(shí)考慮對(duì)稱就行。

無向圖求最短路徑且有路徑輸出

在求最短路的過程中,最短路①它或者是從源點(diǎn)出發(fā)的?、谒蛘呤且粭l經(jīng)過已到其他最短路徑的頂點(diǎn)的路徑。

建立一個(gè)新的結(jié)構(gòu)體類型path,該類型變量d表示到達(dá)某點(diǎn)的最短路徑距離 ,該類型變量pre表示該最短路徑是經(jīng)過哪個(gè)點(diǎn)傳過來的

#include<stdio.h>
#include<string.h> 
#include<stdlib.h>
#define max 900000000
typedef struct{ 
  int d;//到達(dá)某點(diǎn)的最短路徑距離 
  int pre;//該最短路徑是經(jīng)過哪個(gè)點(diǎn)傳過來的,源點(diǎn)或其他某個(gè)點(diǎn) 
}path;
//有向圖 
int main(){
  int n,m,a,b,v,i,j,min,k,from;
  scanf("%d%d",&n,&m);//輸入n個(gè)頂點(diǎn),m條邊 
  int g[n+1][n+1],vis[n+1];//g[i][j]表示i到j(luò)的邊的權(quán)值,vis[i]表示到此頂點(diǎn)的最短路是否已經(jīng)找到,d[i]當(dāng)前源點(diǎn)到i頂點(diǎn)的最短路徑 
  path to[n+1];//記錄當(dāng)前到某個(gè)點(diǎn)的最短路徑以及從哪個(gè)點(diǎn)傳過來的 
  memset(vis,0,sizeof(vis));
  for(i=0;i<=n;i++){ 
    for(j=0;j<=n;j++){
      g[i][j]=max;
    }
    to[i].d=max;  
  }
  for(i=0;i<m;i++){//i到j(luò)的邊權(quán)值儲(chǔ)存到g數(shù)組中,i點(diǎn)到j(luò)點(diǎn)無直接相連的邊時(shí),g[i][j]=max 
    scanf("%d%d%d",&a,&b,&v);
    g[a][b]=v;
    g[b][a]=v;
  }
  for(i=2;i<=n;i++){
      to[i].d=g[1][i]; //初始化源點(diǎn)到i點(diǎn)邊權(quán)值,之后過程中會(huì)發(fā)生變化 
      if(g[1][i]!=max){
       to[i].pre=1; 
      } 
  }
  vis[1]=1;
  for(i=2;i<=n;i++){//共循環(huán)n-1次,每循環(huán)一次,確定一條最短路,再次循環(huán)時(shí)這條路就不用考慮了,去尋找下一條最短路 
    min=max;
    for(j=2;j<=n;j++){//尋找下一條當(dāng)前最短路 
      if(to[j].d<min&&vis[j]==0){
       min=to[j].d;
       k=j;
      }  
    }
    vis[k]=1;//找到了,到k點(diǎn)的路是當(dāng)前最短路,標(biāo)記它,根據(jù)它尋找下一條最短路 
    for(j=2;j<=n;j++){
      if(to[j].d>to[k].d+g[k][j]&&vis[j]==0){//經(jīng)過此k點(diǎn)到達(dá)j點(diǎn)的路徑是否小于其他到達(dá)j點(diǎn)的路徑 
        to[j].d=to[k].d+g[k][j];
        to[j].pre=k;//改變j點(diǎn)是誰(shuí)傳來的,現(xiàn)在到j(luò)點(diǎn)的最短路徑是經(jīng)過k點(diǎn)的,由j點(diǎn)傳來 
      }
    }
  }  
  for(i=2;i<=n;i++){//輸出到達(dá)個(gè)點(diǎn)的最短路徑 
    printf("%d ",to[i].d);
    printf("%d ",i);
    j=i;
    while(j!=1){
      j=to[j].pre;
      printf("%d ",j);
    }
    printf("\n");
  }
  return 0;
}

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)我們的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

上一篇:C語(yǔ)言實(shí)現(xiàn)學(xué)生選課系統(tǒng)

欄    目:C語(yǔ)言

下一篇:基于C語(yǔ)言實(shí)現(xiàn)學(xué)生選課系統(tǒng)

本文標(biāo)題:Dijkstra算法最短路徑的C++實(shí)現(xiàn)與輸出路徑

本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/438.html

網(wǎng)頁(yè)制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語(yǔ)言數(shù)據(jù)庫(kù)服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有