[板子]三种最短路

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 void SPFA(int x){
 4     memset(dis,0x3f,sizeof dis);
 5     memset(vis,0,sizoef vis);
 6     queue<int> q;
 7 
 8     vis[x]=1;dis[x]=0;
 9     q.push(x);
10     while(!q.empty()){
11         int now=q.front();
12         for(int i=head[now];i;i=nxt[i])if(dis[to[i]]>dis[now]+c[i]){
13             dis[to[i]]=dis[now]+c[i];
14             if(!vis[dis[to[i]]]) q.push(to[i]);
15         }
16         vis[now]=0;q.pop();
17     }
18 }
19 /*
20     不同点也许是Dij用的是优先队列,而spfa用的是队列?
21     Dij保证每次取出都是没更新过中的最小值,而spfa通过不断的松弛达到最优解。
22     还是用Dij比较稳,复杂度有保证,但spfa可以处理负环而Dij不能。
23 */
24 void Dijkstra(int x){
25     memset(dis,0x3f,sizeof dis);
26     memset(vis,0,sizeof vis);
27     priority_queue<pair<int,int> >q;
28 
29     dis[x]=0;q.push_back(make_pair(0,x));
30     while(!q.empty()){
31         int y=q.top().second;q.pop();
32         if(vis[y])continue;vis[y]=1;
33         for(int i=head[y];i;i=nxt[i])if(dis[to[i]]>dis[y]+c[i]){
34             dis[to[i]]=dis[y]+c[i];
35             q.push(make_pair(-dis[to[i]],to[i]));
36         }
37     }
38 }
39 
40 void Floyed(){
41     for(int k=1;k<=n;++k)
42         for(int i=1;i<=n;++i)
43             for(int j=1;j<=n;++j)
44                 dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
45 }

 

posted @ 2019-08-17 06:20  _xuefeng  阅读(24)  评论(0编辑  收藏  举报