單源最短路dijkstra演算法 優化史

2022-06-02 01:12:11 字數 3317 閱讀 3532

一下午都在學最短路dijkstra演算法,總算是優化到了我能達到的水平的最快水準,然後列舉一下我的優化歷史,順便總結總結

最樸素演算法:

鄰接矩陣存邊+貪心||dp思想,幾乎純暴力,luogutle+mle,

算優點??:但好寫好想,比下面的**短了差不多一半。

#include #include 

#include

using

namespace

std;

intmain()

,dis[10

];

int inf=99999999

; scanf(

"%d %d\n

",&point,&number);

intx;

cin>>x;

for(int i=1;i<=point;i++)

for(int j=1;j<=point;j++)

if(i==j)a[i][j]=0

;

else

a[i][j]=inf;

for(int i=1;i<=number;i++)

for(int i=1;i<=point;i++)

dis[i]=a[1

][i];

for(int i=1;i<=point-1;i++)

book[u]=1

;

for(int k=1;k<=point;k++)

}for(int i=1;i<=point;i++)

cout

"return

0;

}

第一次優化是前向星存邊,

比上面最樸素的大量省空間,也省了部分時間,luogu上共用時1400ms+,乙個點max接近五百。

1 #include2 #include 3 #include 

4 #include 5 #include 6 # include 7

#define maxi 2147483647;89

using

namespace

std;

1011

struct

node

12edge[1000000

];17

int head[20000];//

某點為父節點運出的最後一條邊

18int cnt=0,curr;//

邊id19

20 inline void add(int a,int b,int c)//

建立邊向前星

2128

29int

main()

30;//

是否已經加入最短路

32long

long dis[20001];//

最短路存值

33int

n,m,s;

34int

a,b,c;

3536 scanf("

%d%d%d

",&n,&m,&s);

37for(int i=1;i<=n;i++)//

初始化邊權值為無窮

38 dis[i]=maxi;

39for(int i=0;i)

4044

//讀入

45 curr=s;

46 dis[s]=0;//

到最初點距離為零

47long

long

minn;

4849

while(!visit[curr])

5057 minn=2147483647;58

for (int i=1;i<=n;i++)

59if(!visit[i]&&minn>dis[i])

6064}65

for (int i=1;i<=n;i++)

66 printf("

%lld

",dis[i]);

67return0;

68 }

dijkstra優化1

最後的優化使**長達近百行

主要運用:快讀快寫,優先佇列(堆),前向星存邊

不過這次優化使用結構體存邊的時候發生了玄學錯誤,現在還是找不出錯,不過用幾個陣列存邊就ac了???

個人是喜歡結構體的,畢竟好寫也整齊,但是沒通過的話就不發出來了

這個複雜度又比上乙個程式降低了不少,luogu 共用時500+ms,單個點max160+ms,比上乙個快了大概3,4倍

下面這個是ac的陣列存邊。

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 

8#define maxn 10005

9#define maxm 500005

10#define inf 2147483647

1112

using

namespace

std;

1314

int n,m,cnt=0;15

bool

visit[maxn];

16int

head[maxm],next[maxm],v[maxm],w[maxm],dist[maxn];

1718 inline int

read()

1927

28void write(int

x)29

3536

struct

c***7

42};

4344

void add(int a,int b,int

c)45

5253

void dijk(int

s)5473}

74}75return;76

}7778int

main()

7992

for(int i=1;i<=n;i++)

93 dist[i]=inf;

94dijk(s);

95for(int i=1;i<=n;i++)

96 write(dist[i]),putchar('');

97return0;

98 }

dijkstra優化2

注意!這不是最優化dijkstra,只是個人能力能達到的最優化了。。。

寫那麼長的**還是挺有成就感的

單源最短路 Dijkstra演算法

前提 沒有負邊 如果有負邊,可以用此方法檢查是否有負圈 const max v max v 表示邊的權重值 d max v 儲存從起點到每個點的總權重值 bool used max v 表示當前點是否已經訪問完畢 思想 找到乙個已經確定最短距離的點,更新跟它相鄰的點,之後這個點就不用關心了。起點最短...

單源最短路演算法 Dijkstra

dijkstra演算法是單源最短路演算法,可以求解不帶負權邊的圖中,從源點s到其它所有點的最短路。時間複雜度近似o n 2 可以用堆優化。一般用鄰接表,也可用鄰接矩陣。在稠密圖上會有較好的效能表現。include include using namespace std int s,t,n,m,las...

單源最短路 Dijkstra演算法

本文 自王陸的文字,僅作學習使用。dijkstra 迪傑斯特拉 演算法是典型的單源最短路徑演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。問題描述 在無向圖 g v,e 中,假設每條邊 e i 的長度為 w i 找到由頂點 v0 到...