實際上我們可以這樣做:每次僅僅對最短路的估計值發生了變化的頂點的所有出邊執行鬆弛操作
我們可以利用佇列來維護這些點
我們每次都選取隊首的頂點u,對頂點u的所有出邊進行鬆弛操作
如果通過u->v這條邊,可以使得源點到頂點v的最短路徑變短,且頂點v不在當前佇列中
那麼我們就把頂點v放入隊尾
在對頂點u的所有出邊鬆弛完成之後,就將u出隊
實際上,我們就是在完成「得到隊首,更新判斷隊首,出隊進行下一輪」的操作
#include int main()
,book[6]= ; //book陣列用來記錄哪些頂點在佇列中,可以降低複雜度
int que[101] = , head = 1 , tail = 1 ; //定義佇列並初始化
int inf = 99999999 ; //用inf儲存我們認為的正無窮值
scanf("%d %d",&n,&m) ;
//初始化dis陣列,這裡是1號頂點到各個頂點的初始路程
for(i=1;i<=n;i++)
dis[i] = inf ;
dis[1] = 0 ;
for(i=1;i<=n;i++)
book[i] = 0 ;
for(i=1;i<=n;i++)
first[i] = -1;
for(i=1;i<=m;i++)
//從1號頂點開始,1號頂點入隊
que[tail] = 1 ;
tail++;
book[1] = 1 ;
while(headdis[u[k]] + w[k])
}k = next[k];
}//出隊
book[que[head]] = 0 ;
head++;
}//輸出1號頂點到其餘各個頂點的最短路徑
for(i=1;i<=n;i++)
printf("%d",dis[i]);
getchar();getchar();
return 0 ;
}
其關鍵之處在於:只有那些在前一遍鬆弛中改變了最短路程估計值的頂點,才可能引起它們鄰接點最短路徑估計值發生改變
另外,這種優化在形式上和寬度優先搜尋類似,不過寬度優先**隊的元素不會返回佇列,而這裡要看情況而定
Codeup最短路徑 最短路徑
n個城市,標號從0到n 1,m條道路,第k條道路 k從0開始 的長度為2 k,求編號為0的城市到其他城市的最短距離。第一行兩個正整數n 2 n 100 m m 500 表示有n個城市,m條道路,接下來m行兩個整數,表示相連的兩個城市的編號。n 1行,表示0號城市到其他城市的最短路,如果無法到達,輸出...
Codeup最短路徑 最短路徑問題
給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。輸入n,m,點的編號是1 n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 s,t 起點s,...
最短路徑之最短路徑問題
提交 狀態 討論版 命題人 外部匯入 題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點間的直線距離。現在的 任務是找出從一點到另一點之間的最短路徑。輸入共n m 3行,...