用途
用來確定一個點到其他幾個點的最近距離(不含負權的有向圖)
算法思想
1.以各點到初始點的距離爲最近距離(即直接與初始點相連的邊的權),如果不直接相連的距離則爲無窮。
2.選取這些邊最短的,並判斷該邊的head與其他的點是否相連,如果相連之後的距離小於目前的最小距離,就更新初始點到各點的最小距離。(此時選出的最短的這條邊的權就是他的head到初始點的最近距離,這時已經不需要判定該head距離初始點的最近距離,爲其做上標記)
3.不斷重複2操作知道所有的點都被標記,這是就選出了最近距離。
代碼實現
int a,b; //a代表的是節點數,b代表的是弧的數量
int start; //start代表的是初始位置
int path[a][a]; //鄰接矩陣
int path2[a], p2[a]; //path2待選擇的路徑,已選擇好的最短路徑
for(int i=0;i<a;i++)
{
for(int j=0;j<a;j++)
{
path[i][j]=10000; //對對鄰接矩陣進行初始化
}
}
for(int i=0;i<a;i++)
{
p2[i]=10000; //對最短路徑進行初始化
}
string p[a];
int a2,b2,length;
for(int i=0;i<b;i++)
{
cin>>a2>>b2>>length;
path[a2][b2]=length;
} //輸入鄰接矩陣的內容
for(int i=0;i<a;i++)
{
path2[i]=path[start][i];
}
for(int i=0;i<a-1;i++)
{
int h=pd(path2,a); //pd是自定義的一個找最小權邊的函數
if(h!=-1) // h=-1說名path2中的未標記節點到初始點最近距離的值還是10000,即包括初始點在內的已標記節點與他們都無邊相連,初始點無法到達他們,則循環無需進行下去
{p2[h]=path2[h];
path2[h]=0;
for(int j=0;j<a;j++)
{
if((p2[h]+path[h][j])<path2[j])
{
path2[j]=p2[h]+path[h][j];
p[j]=p[h];
p[j].push_back(48+h);
}
}
}
else{
break;
}
}