⑴ 最短路徑演算法作用
可以實現距離最短以及時間最短,從而為你節約行程的成本
⑵ "最短路徑優先演算法"的優缺點
這個演算法一般出現在網路中,用於路由器的路由定址,我也只了解這方面的優缺點。如果不對,LZ就別看了。
所謂最短路徑,實際上說的是跳數。比如從一條路走會經過三個路由器,而從另一條路走,會經過兩個路由器,那麼此演算法會判斷2跳比3跳要短,但具體每一跳會花多長時間,經過多長路程,它不會考慮的。所以不一定演算法的最短路徑就是真實的最短。因為很多因素演算法沒有考慮,比如通信質量,網線長度……
C語言我只看過一個模擬現實的例子,大概是說公車走什麼路線長度最短,那個演算法考慮的是路線的長短,而不是跳數,優點當然就是路線的絕對最短,缺點就是沒考慮到其他現實因素,比如是否堵車(相當於網路通信質量)之類。
總之不管什麼演算法,考慮到的因素就是它的優點,反過來說,缺點往往就是演算法忽略的因素。
補充一下,如果說的不是演算法本身的優劣,而是細節的實現方面,那就是從時間復雜度和空間復雜度兩個方面去考慮了,希望對LZ有用。
⑶ 最短路徑演算法 Dijkstra 用C語言編出來
#include"iostream.h"
#include"stdlib.h"
#define MAXPOINT 3//定義最大的頂點數目
#define limit 32767 //設置沒有路徑的權代替無窮大
struct record{ //沒個頂點的數據結構設置為一個數組隊列
int number; //頂點號
int flag; //標志是否從隊列中被選過如果為1表示選過為0表示未選
int allpath; //從源點到這個點的當前最短距離(權最小)
}path[MAXPOINT+1];
int cost[MAXPOINT+1][MAXPOINT+1]; //用來表示圖的鄰接矩陣
void main()
{int i,j,temp,front=1,rear=MAXPOINT,N,minnumber;
//temp表示在數組隊列中的當前下標 front表示隊列首 rear表示隊列尾
//N 表示待輸入的源點號碼 minnumber 表示選中的點的號碼
int min=32768; //設置一個初始值
for(i=1;i<=MAXPOINT;i++)
for(j=1;j<=MAXPOINT;j++)
{cout<<"請輸入從第"<<i<<"點到第"<<j<<"點的路徑長度(權)如果沒有路徑的話請輸入'32767' "<<endl;
cin>>cost[i][j]; //初始化所有點之間的(權)路徑值
}
//cout<<"請輸入源點號"<<endl; //輸入一個起點
//cin>>N;
for(N=MAXPOINT;N>=1;N--)//把每一個點輪流地都設置為起點,可以求出任意一對頂點之間的最短路徑
{ for(i=front;i<=rear;i++) //初始化每個點的信息
{if(i==N)
path[i].allpath=0;
else
path[i].allpath=limit;
path[i].flag=0;
path[i].number=i;
}
while(rear>=1) //控制循環次數
{for(temp=front;temp<=MAXPOINT;temp++)
{ if(path[temp].allpath<min&&path[temp].flag==0)//選出一個具有最值
//的點
{ minnumber=path[temp].number;
min=path[temp].allpath ;
}
}
min=32768;
path[minnumber].flag=1;//把選中的點的標志變數置1表示已經被選過避免選中
for(i=1;i<=MAXPOINT;i++)//進行類似廣度優先搜索,更新最短路徑
{if((i!=minnumber)&&(path[minnumber].allpath+cost[minnumber][i]<path[i].allpath))
path[i].allpath=path[minnumber].allpath+cost[minnumber][i];
}
rear--;//次數減1
}
rear=MAXPOINT; //恢復數組以便於下一點的循環
for(j=1;j<=MAXPOINT;j++)
{ cout<<"第"<<N<<"點到第"<<j<<"點的最短路徑長度(權)為";
cout<<path[j].allpath <<endl;
}
}
}
//這個程序可以求出任意一對頂點之間的最短路徑,不過這種演算法效率還不是很高,還有其他演算法待續
⑷ 最短路徑演算法應用在哪些方面
網路通路, 凡事可以使用圖作為模型的問題都基本可以用到,比如游戲地圖的尋找,交通路線的尋找,這種最短路徑都可以用。
⑸ 求圖中任意兩點之間最短路徑有什麼演算法
單源節點到其他任意節點的最短路徑採用Dijkstra演算法,任意兩個節點之間的最短路徑使用Floyd演算法,這兩個演算法有很多地方可以找打。
⑹ 最短路徑優先演算法
從某頂點出發,沿圖的邊到達另一頂點所經過的路徑中,各邊上權值之和最小的一條路徑叫做最短路徑。解決最短路的問題有以下演算法,Dijkstra演算法,Bellman-Ford演算法,Floyd演算法和SPFA演算法等。
⑺ 記錄所有最短路徑的最短路徑演算法
沒有一個演算法是萬能的
Dijkstra:單源最短路徑
Floyd:每對點最短路徑
SPFA(Bellmanford+隊列):快速單源最短路徑(可負權)
還有很多求最短路徑的演算法,但是歸其根本,無外乎:
Label Setting和Label Correcting兩大類,其實就是搜索法+動態規劃。
只要靈活地掌握了搜索法、動態規劃和圖論,這些演算法就都會了。
⑻ 最短路徑演算法 C語言
#include<stdio.h>
#defineMAXNODE108
intpath[MAXNODE+1][MAXNODE+1]={0};
intmain(void)
{
FILE*fpr,*fpw;
intva,vb,i,j,k;
fpr=fopen("in.txt","r");/*讀取的文件名稱in.txt*/
fpw=fopen("out.txt","w");/*path的數據在out.txt中展現*/
while(fscanf(fpr,"%d%d",&va,&vb)!=EOF)
path[va][vb]=path[vb][va]=1;
for(k=1;k<=MAXNODE;++k){
for(i=1;i<=MAXNODE;++i){
for(j=1;j<=MAXNODE;++j){
if(!path[i][k]||!path[k][j])
continue;
if(!path[i][j])
path[i][j]=path[i][k]+path[k][j];
elseif(path[i][j]>path[i][k]+path[k][j])
path[i][j]=path[i][k]+path[k][j];
}
}
}
for(i=1;i<=MAXNODE;++i){
for(j=1;j<=MAXNODE;++j){
if(i==j)
fprintf(fpw,"%-10d",0);
elseif(path[i][j])
fprintf(fpw,"%-10d",path[i][j]);
else
fprintf(fpw,"%-10d",-1);
}
fprintf(fpw," ");
}
return0;
}
注意:floyd演算法中k為最外層,這是動態規劃的思想,不能改變i,j,k的順序!!!
這是之前的答案的錯誤之處。
-1表示不通。
具體程序分析,我可以加你QQ,願意的話,你把QQ寫給我。