幾種比較常用的單源(所用點到某一確定點的距離)最短路徑的演算法有:dijkstra、floyd、spfa、bellman-ford等。
floyd演算法的思想就是動態規劃,用三層迴圈,來不斷的去更新兩個點之間的距離,雖然比較簡單,但是時間複雜度是o(n^3),適合應用資料比較小的題型。
#include#include#include#includeusing namespace std;
#define max 10000
int ma[1005][1005];
void floyd(int n)}}
}int main()
for(i = 0; i < m; i++)
floyd(n);
int st, en;
cin>>st>>en;
if(ma[st][en] == max)cout<<"-1"#include#include#includeusing namespace std;
#define inf 0x3f3f3f3f
int ma[300][300];
int dis[300], vis[300];
int n, m;
void dijkstra(int st)
}vis[sign] = 1;
for(j = 0; j < n; j++)
}}int main()
for(i = 0; i < m ; i++)
int st, en;
scanf("%d %d", &st, &en);
dijkstra(st);
printf("%d\n",dis[en]==inf?-1:dis[en]);
}return 0;
}
用優先佇列優化:
#include#include#include#includeusing namespace std;
#define max 1<<30
struct p
};int ma[1005][1005], dis[1005];
int vis[1005];
int n, m;
void dijkstra(int st)
dis[st] = 0;//初始點
p f;
f.pos = st, f.val = 0;
que.push(f);//加入佇列
while(!que.empty())}}
}int main()
for(int i = 0; i < m; i++)
int st, en;
cin>>st>>en;
dijkstra(st);
if(dis[en] == max)cout<<"-1"#include#include#include#includeusing namespace std;
#define max 1000000
int dis[1005];
struct edgee[1005];
int n, m;
void bellman_floyd(int st)
if(dis[e[j].from] > dis[e[j].to] + e[j].val)}}
}int main()
int st, en;
cin>>st>>en;
bellman_floyd(st);
if(dis[en] == max)cout<<"-1"#include#include#include#include#includeusing namespace std;
#define max 1000000
int dis[1005];
int vis[1005];
int ma[1005][1005];
int n, m;
queueq;
void spfa(int st)
vis[st] = 1;
dis[st] = 0;
q.push(st);
while(!q.empty())}}
vis[t] = 0;
}}int main()
for(i = 0; i < m; i++)
int st, en;
cin>>st>>en;
spfa(st);
if(dis[en] == max)cout<<"-1"《優化:使用vector來儲存資料
#include#include#include#include#includeusing namespace std;
#define max 1000000
int dis[1000], vis[1000];
struct node
k;vectorg[1000];
queueq;
int n, m, i, j;
void spfa(int st)
dis[st] = 0;
vis[st] = 1;
q.push(st);
while(!q.empty())}}
vis[v] = 0;
}}int main()
int s, t;
cin>>s>>t;
spfa(s);
if(dis[t] == max)cout<<"-1"
// for(i = 0; i < n; i++)cout
}
杭電ACM1874(最短路徑)
題目大意 中文題目 題意分析 最典型的最短路徑,非常簡單,dijkstra或者floyd演算法都可以直接解決,這裡我用的是floyd演算法。ac include using namespace std define inf 2000000 int main for int i 0 icin a b ...
杭電1874暢通工程續 最短路徑
題目 problem description 某省自從實行了很多年的暢通工程計畫後,終於修建了很多路。不過路多了也不好,每次要從乙個城鎮到另乙個城鎮時,都有許多種道路方案可以選擇,而某些方案要比另一些方案行走的距離要短很多。這讓行人很困擾。現在,已知起點和終點,請你計算出要從起點到終點,最短需要行走...
杭電2544 最短路徑
problem description 在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?input 輸入包括多組資料。每組資料第一行是兩個整...