最短路徑《一》(以杭電1874為例)

2021-08-24 20:38:38 字數 2746 閱讀 8140

幾種比較常用的單源(所用點到某一確定點的距離)最短路徑的演算法有: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 輸入包括多組資料。每組資料第一行是兩個整...