一下午都在學最短路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 #includedijkstra優化14 #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 }
最後的優化使**長達近百行
主要運用:快讀快寫,優先佇列(堆),前向星存邊
不過這次優化使用結構體存邊的時候發生了玄學錯誤,現在還是找不出錯,不過用幾個陣列存邊就ac了???
個人是喜歡結構體的,畢竟好寫也整齊,但是沒通過的話就不發出來了
這個複雜度又比上乙個程式降低了不少,luogu 共用時500+ms,單個點max160+ms,比上乙個快了大概3,4倍
下面這個是ac的陣列存邊。
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #includedijkstra優化28#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,只是個人能力能達到的最優化了。。。
寫那麼長的**還是挺有成就感的
單源最短路 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 到...